Go Runtime(七):Signal与cgo线程管理

本文源码基线为 Go 1.26.2、Linux/amd64。Signal 的编号、trampoline 和上下文结构具有平台差异;本文只把 Unix/Linux 主线作为具体实现,Windows 异常和 IOCP 回调需要单独对照平台文件。 信号和 cgo 都会打破普通 Go 调用链的假设:信号可以在任意指令附近异步到达,C 代码可能阻塞、修改线程状态,甚至从一个非 Go 创建的线程回调 Go。 runtime 必须在这些边界上重新建立可识别的线程、栈和执行现场,同时避免在不安全上下文中执行分配、加锁或调度操作。 Signal承担哪些职责 Go runtime 使用或处理信号的目的并不相同: 把 SIGINT、SIGTERM 等转交给 os/signal。 将某些同步 fault 转换为 Go panic。 用异步信号抢占长时间运行的 goroutine。 采样 SIGPROF 生成 CPU profile。 在 cgo 场景与 C 安装的 handler 协作。 对致命信号打印 traceback 并退出。 因此不能笼统地说“Go 捕获了信号”。同一个 handler 入口会根据 signal 类型、发生线程和当前 G/M 状态走不同分支。 sigtable描述策略 runtime 为平台信号维护一张策略表,描述信号的默认行为和处理属性。概念上包括: TEXT是否通知用户层 是否默认忽略 是否导致 panic 是否打印 stack 是否导致进程退出 是否属于同步 fault 策略还会受程序是否导入 os/signal、是否使用 cgo、signal disposition 是否被外部代码修改等因素影响。 ...

August 18, 2026