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

Vishwasa Navada K:

我试图在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信号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Qt在Windows和Linux上捕获Ctrl + C

在带有 Python 子进程的 BASH 中是否有任何其他替代“>”的方法

Windows上除SIGKILL以外的其他信号无法终止进程

for 循环是否在 C++ 中创建向量、数组或任何其他数据类型的副本?

C-使用scanf(或任何其他函数)以int格式获取日期MM / DD / YYYY

读取ComboBox(或任何其他Windows控件)的内容

特定密钥和任何其他密钥的组合

Xpath按类和任何其他子类选择

NULL,然后是 GROUP BY 中的任何其他值

如何使用 JQuery 或任何其他技术加载底部

使用Typescript返回void或任何其他类型

使用perl或任何其他工具进行多行编辑

.NET核心是否支持SqlFileStream或使用C#从SQL Server中获取文件流的任何其他方法?

在没有任何其他应用程序的情况下使Linux Apt-将后台进程获取到终端

Linux C捕获终止状态的终止信号

使用 C++ 或 Python 将表格 PDF 数据转换为文本(或任何其他可读格式)文件

无法捕获全屏图像?(带有任务栏和任何其他打开的窗口)

如何在其他脚本的任何其他函数中调用包含参数的函数?

使用信号量不会唤醒其他进程

如何在 c++/python 或使用任何其他 linux 命令中为第一列的退化值取第二列的平均值?

在golang中,移动打开的文件是否会导致泄漏或任何其他问题?

如何使用tcpdump或任何其他开放式资源工具捕获网络中的bitorrent infohash ID?

如何使用Windows中的任何命令行(例如,Python或任何其他基于Windows的语言/软件)来增加和减少文件中的单词

将任何类的&:hover扩展到SASS或SCSS中任何其他类的悬停

不使用heapq和任何其他使用python的库的K-way-merge

如何下载和使用除默认安装的内核以外的任何其他内核

ctrl + c会将SIGINT信号发送到Linux中的父进程和子进程吗?

您可以在Win10的“ Linux的Windows子系统”中安装任何其他发行版吗?

在rangy中创建荧光笔时使用除文档以外的任何其他元素