我试图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)事件的发生?
从父进程发送信号给C中的subprocess
在eclipse中运行时,linux线程被实时信号挂起
ptrace'ingmultithreading应用程序
为什么SIGINT在这里被抓到?
C中断系统调用
根据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] 举报,一经查实,本站将立刻删除。