使用cgo处理信号时Go进程无法捕获信号的问题及方案咨询
问题:通过Cgo捕获信号并获取发送方PID的进程问题及解决方案尝试
需求与问题
- 需求:借助C语言结合cgo处理信号,获取信号发送方的PID等信息——Go标准库(syscall、os等)未提供此类信息
- 问题现象:运行
go run .时会生成两个进程:go run .主进程和名为signal的Go包进程;向go run .进程发送信号无响应,仅向signal进程发送信号时能输出预期信息 - 推测原因:cgo隐式fork了进程,导致C的信号处理器无法作用于Go主进程
目标
捕获发送给Go进程的任意信号,输出至少PID、PPID等信息,同时希望了解更优实现方案,以及cgo进程控制机制的相关文档
更新:解决方案尝试
感谢@kostix和@eik的解答!
尝试通过go build编译生成二进制文件后直接运行,在C的信号处理器返回前,将SIGTERM的处理器恢复为旧动作并再次触发SIGTERM,此时Go的signal.Notify能够成功将os.Signal推入通道。但该操作会引发递归信号,不过当前实现已满足“仅处理一次信号后交给Go处理器”的需求
内容的提问来源于stack exchange,提问作者WeiAnHsieh
相关产品推荐
相关产品推荐

