-
在信号处理程序中只调用异步信号安全函数?
2026-07-01 19:13:17
当内核向进程传递信号时,它会停止进程的执行,无论它在哪里,注入对信号处理程序函数的调用,然后调度该进程,从而导致它执行信号处理程序。因为该调用可以被注入到任何地方,所以在注入信号处理程序时,您的程序可能处于操作非本地状态的中间。调用另一个依赖于该非本地状态的函数将导致未定义的行为。
任何访问/修改非本地状态的函数通常都不是信号安全的。来自man 7 signal-safety:
为了避免不安全函数的问题,有两个可能的选择: 1.确保(a)信号处理程序只调用异步信号安全函数,(b)信号处理程序本身对于主程序中的全局变量是可重入的。2.当调用不安全的函数或对信号处理程序也访问的全局数据操作时,阻止主程序中的信号传递。通常,在任何复杂的程序中,第二选择都是困难的,所以第一选择是第一选择。
该手册页将继续枚举一组信号安全函数。