【问题标题】:Capturing ctrl+c or any other process terminating signals in windows and linux with golang使用 golang 在 windows 和 linux 中捕获 ctrl+c 或任何其他进程终止信号
【发布时间】:2016-06-11 05:14:25
【问题描述】:

我正在尝试在 go 中构建一个聊天室应用程序,并且我想在客户端使用 ctrl+c 或按下终端的关闭按钮时调用注销功能。
我尝试了给定 herehere 的方法,但它们没有捕获任何信号(在 Windows 10 和 Fedora 23 中尝试过)。这是我的代码sn-p,

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 同时运行,是这个函数没有捕获任何信号的原因吗?

任何帮助将不胜感激。

【问题讨论】:

  • 在 unix 上捕获信号很好,因此您需要显示随附的代码。我对 Windows 不是很熟悉,使用 IIRC,您无法将 ctrl+c 作为信号捕获,它必须由终端处理。
  • @JimB 其余代码可以查看here。但是那没有我上面提到的代码sn-p。

标签: linux windows go signals


【解决方案1】:

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

【讨论】:

  • 感谢您提供详细的答案和文档报价。我还发现另外一个 goroutine 与之发生冲突,改变函数调用的顺序也帮助我解决了这个问题。
  • 感谢您的提问和回答。无法弄清楚为什么我的代码没有捕捉到 SIGINT - 将捕捉到的 goroutine 作为第一个代码放在 main 中起到了作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2016-06-02
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
相关资源
最近更新 更多