我正在研究使用sigprocmask
来阻止特定信号(在这种情况下,SIGALRM
和SIGCHLD
),当执行一段关键的代码段时。与这些信号相关联的两个信号处理程序都将访问和修改中央数据结构,所以当主进程正在处理它时,阻止它们访问它是至关重要的。信号执行期间sigprocmask
目前,我的计划是在代码的关键部分开始时简单地禁用这些信号,然后在最后重新启用它们。
void criticalFunction(void) {
// disable signals with sigprocmask
// critical code
// enable signals with sigprocmask
}
但是,信号处理程序对于将被阻止的信号也会呼叫criticalFunction
。当他们调用sigprocmask
函数并启用自己的信号阻塞时会发生什么?他们会失速还是继续执行? (或第三个条件。)
唯一要注意的我能够找到的有关这个如下:
如果sigprocmask()执行被称为一个信号处理程序,从 处理程序返回可以撤销sigprocmask()通过恢复原始的 未决信号掩码的工作。 (http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp)
(这是一个后续问题我刚才的问题:Signal handler accessing queue data structure (race condition?))
POSIX定义了在信号处理程序中执行某些操作的行为,并且您可以执行相当多的操作。这只是非POSIX,普通的C环境,你无法在信号处理程序中做任何事情,并且在这样的环境中,无论如何都没有有用的信号,对于信号处理程序来说没有用处...... –
@ R:是的确,所有的“异步信号安全”功能都可以。特别是,您可以更改信号处理程序内的信号掩码和其他与信号有关的东西。但就一般用户代码而言,最好不要使用信号处理程序。否则,你必须证明你所做的每一件事情都是异步信号安全的,而且这可能是非本地的,很难做到。 –
如果您知道异步信号不安全的功能未被信号处理程序中断,您可以自由地从信号处理程序调用**任何**功能。如果您仔细地屏蔽并揭露信号,即使在多线程代码中,也很容易确保这一点。 –