我目前正在研究在执行关键代码段时使用sigprocmask
来阻止某些信号(在这种情况下,SIGALRM
和)。SIGCHLD
与这些信号关联的两个信号处理程序都将访问和修改中央数据结构,因此在主进程正在处理它时防止它们访问它是至关重要的。
目前,我的计划是在代码的关键部分开始时简单地禁用这些信号,然后在结束时重新启用它们。
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)
(这是我上一个问题的后续问题:信号处理程序访问队列数据结构(竞争条件?))