微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用golang捕获ctrl + c或任何其他进程在windows和linux中终止信号

我试图build立一个聊天室的应用程序,当客户端使用ctrl + c或按下terminal的closuresbutton时,我想调用注销function。

我尝试了这里和这里给出的方法,但他们没有捕获任何信号(在Windows 10和Fedora 23中尝试过)。 这是我的代码片段,

sigc := make(chan os.Signal,1) signal.Notify(sigc,syscall.SIGHUP,syscall.SIGINT,syscall.SIGTERM,syscall.SIGQUIT) go func() { _ = <-sigc fmt.Println("ctrl+c pressed") client.logout() }()

我有一些其他的function使用goroutine同时运行,这是不捕获任何信号背后的原因?

任何帮助,将不胜感激。

线程和信号

是否有跨平台的C信号库可用(更好的开源)?

在内核空间中执行的进程如何知道意外(asynchronous)事件的发生?

在SIGTRAP上是否有任何不可知的获取指令指针的方法

从父进程发送信号给C中的subprocess

在eclipse中运行时,linux线程被实时信号挂起

ptrace'ingmultithreading应用程序

为什么SIGINT在这里被抓到?

C中断系统调用

一个信号来到时,杀死bash脚本前台儿童

根据os.Signal上的文档,应该可以在Windows上捕获中断: https : os.Signal 。 虽然我没有亲自测试过。

我怀疑你的问题是,你应该只使用从os导入的信号,如os.Interrupt ,而不是syscall 。

从https://golang.org/pkg/os/#Signal :

唯一保证在所有系统上出现的信号值是中断(发送进程中断)和终止(强制进程退出)。

从https://golang.org/pkg/syscall/#pkg-overview :

系统调用的主要用途在于为系统提供更加便携的界面的其他包,例如“os”,“time”和“net”。 如果可以,请使用这些软件包而不是这个软件包。

所以,改变你的信号。 signal.Notify通话只捕捉os.Interrupt 。 os.Interrupt信号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐