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

Vis*_*a K 3 linux windows signals go

我试图在go中构建一个聊天室应用程序,并且我想在客户端使用ctrl + c或按终端的关闭按钮时调用注销功能。
我尝试了此处此处给出的方法,但是它们没有捕获任何信号(在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()
}()
Run Code Online (Sandbox Code Playgroud)

我还有其他使用goroutine并发运行的函数,这是该函数无法捕获任何信号的原因吗?

任何帮助,将不胜感激。

for*_*ord 6

根据上的文档os.Signal,应该可以在Windows上捕获中断:https : //golang.org/pkg/os/signal/#hdr-Windows。不过,我还没有亲自测试过。

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

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

保证在所有系统上都存在的唯一信号值是“中断”(向进程发送中断)和“终止”(迫使进程退出)。

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

syscall的主要用途是在其他软件包中,这些软件包为系统提供了更轻便的接口,例如“ os”,“ time”和“ net”。如果可以,请使用这些软件包,而不要使用此软件包。

因此,更改您的signal.Notify呼叫以仅捕获os.Interrupt信号。