我对信号和信号处理很陌生,我正在读一本书,上面写着
在处理程序中只调用异步信号安全函数。异步信号安全或简单安全的函数具有可以从信号处理程序安全调用的属性,因为它不能被信号处理程序中断。注意,许多流行的函数,如printf、sprintf、malloc和exit,都是不安全的。
我有点困惑,下面是我的问题:
什么是安全功能不能被信号处理程序中断?这是否意味着安全函数在开始时会在内部阻塞信号,而在结束之前解除阻塞信号,从而使安全功能不会被其他信号中断?
发布于 2020-09-13 19:51:09
当内核向进程传递信号时,它会停止进程的执行,无论它在哪里,注入对信号处理程序函数的调用,然后调度该进程,从而导致它执行信号处理程序。因为该调用可以被注入到任何地方,所以在注入信号处理程序时,您的程序可能处于操作非本地状态的中间。调用另一个依赖于该非本地状态的函数将导致未定义的行为。
任何访问/修改非本地状态的函数通常都不是信号安全的。来自man 7 signal-safety:
为了避免不安全函数的问题,有两个可能的选择: 1.确保(a)信号处理程序只调用异步信号安全函数,(b)信号处理程序本身对于主程序中的全局变量是可重入的。2.当调用不安全的函数或对信号处理程序也访问的全局数据操作时,阻止主程序中的信号传递。通常,在任何复杂的程序中,第二选择都是困难的,所以第一选择是第一选择。
该手册页将继续枚举一组信号安全函数。
https://unix.stackexchange.com/questions/609184
复制相似问题