信号处理与异步信号安全
更新时间:2026-10-01。信号是“程序执行中插入的一次异常控制流”,写法不当会产生极难查的偶发崩溃。
一、为什么危险
信号在任意点打断当前代码。若 handler 里调用 printf/malloc,而被打断处恰好正在这些函数内部操作全局结构(锁/空闲链表),重入会破坏状态甚至自死锁。
二、正确做法
handler 保持极简:只设置 volatile sig_atomic_t 标志或调用安全函数(write、_exit)。需要复杂处理时用 self-pipe / eventfd:handler 写一个字节,主循环在该 fd 上用 poll/select 统一处理。优先 sigaction 指定行为。

三、常见坑
- handler 里 printf/malloc。
- 用普通 int 标志(非 sig_atomic)。
- 多个信号合并/嵌套未考虑。
小结
总结
信号处理函数可能在任意两条指令间异步打断主程序,若在 handler 里调用 printf/malloc/free 这类非可重入函数,而被打断处恰好在操作它们的内部锁或空闲链表,重入就会破坏状态甚至自死锁;所以 handler 必须极简——只设置 volatile sig_atomic_t 标志或调用 write/_exit 等 async-signal-safe 函数,需要复杂处理时用 self-pipe/eventfd 把信号转成"写一个字节",交给主循环在 poll/select 上统一处理,并用 sigaction 明确行为。