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



我正在尝试在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()
}()

我还有其他一些使用 goroutine 同时运行的函数,是这个函数没有捕获任何信号的原因吗?

任何帮助将不胜感激。

根据 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信号。

最新更新