Golang怎么实现信号转发_Golang如何将收到的信号转发给子进程处理【方法】

张开发
2026/4/15 8:08:03 15 分钟阅读

分享文章

Golang怎么实现信号转发_Golang如何将收到的信号转发给子进程处理【方法】
Go 程序用 os/signal 包的 signal.Notify 将 SIGUSR1 等信号转为 channel 值需配合 goroutine 持续接收否则信号会丢失。Go 程序怎么捕获 SIGUSR1 这类信号Go 用 os/signal 包监听信号核心是 signal.Notify。它把操作系统发来的信号转成 Go channel 中的值而不是靠传统 signal handler 函数回调——这点和 C/Python 不同得适应。常见错误是只监听一次就退出或者没开 goroutine 持续接收导致信号“丢失”signal.Notify 只设置监听规则不自动消费信号必须用 for range 或 显式读取监听后不启动 goroutine 处理主 goroutine 结束程序就退出信号来不及送达误用 syscall.SIGINT 和 os.Interrupt后者在 Windows 上是 os.Kill跨平台建议统一用 os.Interrupt示例片段仅捕获不转发sigCh : make(chan os.Signal, 1)signal.Notify(sigCh, syscall.SIGUSR1, os.Interrupt)go func() { for sig : range sigCh { log.Printf(received %v, sig) }}()子进程启动时怎么让信号能传过去关键不是“转发”而是让子进程继承父进程的信号行为。默认情况下Go 启动的子进程exec.Command会继承父进程的信号 mask 和处理方式但前提是父进程没主动屏蔽或忽略信号。立即学习“go语言免费学习笔记深入”容易踩的坑父进程调用 signal.Ignore 后子进程仍可能收到该信号取决于系统但行为不可控应避免 Ignore改用 Notify 主动传递子进程是 shell 脚本时需确保脚本没用 trap SIGUSR1 之类屏蔽掉信号Linux 下如果子进程是孤儿进程父退出init 进程会接管信号可能被吞掉所以转发逻辑必须在父进程生命周期内完成正确做法启动子进程前确保信号未被忽略且子进程可响应cmd : exec.Command(sh, -c, trap echo got USR1 USR1; sleep 100)cmd.SysProcAttr syscall.SysProcAttr{ Setpgid: true, // 避免和父进程共用进程组方便后续精准 kill}err : cmd.Start()怎么把 SIGUSR1 安全地发给子进程不能简单用 cmd.Process.Signal 直接发——如果子进程已退出、PID 被复用信号可能误发给其他进程。必须确认子进程还活着且 PID 有效。 Mokker AI AI产品图添加背景

更多文章