我正在尝试在go中构建一个聊天室应用程序,我想在客户端使用ctrl + c或按下终端的关闭按钮时调用注销功能。
我尝试了here和here给出的方法但他们没有捕获任何信号(在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()
}()
我还有其他一些使用goroutine同时运行的函数,这个函数背后的原因是不捕获任何信号吗?
任何帮助将不胜感激。
答案 0 :(得分:4)
根据os.Signal
上的文档,应该可以在Windows上捕获中断:https://golang.org/pkg/os/signal/#hdr-Windows。不过,我没有亲自测试过。
我怀疑您的问题是您应该只使用从os
导入的信号,例如os.Interrupt
,而不是syscall
。
来自https://golang.org/pkg/os/#Signal:
所有系统上唯一保证存在的信号值是Interrupt(发送进程中断)和Kill(强制进程退出)。
来自https://golang.org/pkg/syscall/#pkg-overview:
syscall的主要用途是在其他软件包中提供一个更便携的系统接口,例如“os”,“time”和“net”。如果可以,请使用这些包而不是这个包。
因此,请更改signal.Notify
来电以仅捕获os.Interrupt
信号。