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

时间:2016-02-28 02:22:11

标签: linux windows go signals

我正在尝试在go中构建一个聊天室应用程序,我想在客户端使用ctrl + c或按下终端的关闭按钮时调用注销功能。
我尝试了herehere给出的方法但他们没有捕获任何信号(在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同时运行的函数,这个函数背后的原因是不捕获任何信号吗?

任何帮助将不胜感激。

1 个答案:

答案 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信号。