2016-02-28 317 views
1

我正在尝试在go中构建chatroom应用程序,并且当客户端使用ctrl + c或按下终端的close按钮时,我想调用注销功能。
我尝试了方法herehere,但他们没有捕获任何信号(在Windows 10和Fedora 23中尝试过)。这里是我的代码片段,通过golang捕获ctrl + c或任何其他进程在windows和linux中终止信号

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

在unix上捕获信号很好,所以你需要显示随附的代码。我不是很熟悉Windows,因为IIRC你不能捕获ctrl + c作为信号,它必须由终端处理。 – JimB

+0

@JimB剩下的代码可以在这里查看(https://github.com/GOOFS/go-goof-Talk/blob/master/client/client.go)。但是,这并没有我上面提到的代码片段。 –

回答

3

根据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

系统调用的主要用途是,向系统提供一个更便携式界面其他包,如“OS”,“时间”和“网”的内部。如果可以的话,使用这些软件包而不是这一个。

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

+0

感谢您的详细解答和文档报价。我还发现另外一个例程与它冲突,改变函数调用的顺序也帮助我解决了这个问题。 –