假设有两个进程,父进程和子进程,它们使用信号进行同步。在父进程中,用于与子进行同步的函数的行为如下所示。
WAIT_CHILD(){
while(sigflag == 0){ //sigflag will be set to 1 in a signal handler in the child process
sigsuspend(&zeromask); //No signal is in the mask set
}
//do sth....
}
我的问题是,我们可以使用pause()
替换sigsuspend(&zeromask)
吗?
答案 0 :(得分:4)
没有。如果主要信号掩码阻止了孩子发送的信号,则发布的代码只有竞争条件,如果是这种情况,那么,因为pause()
不会改变信号掩码,它会阻止永远。
信号必须最初被阻止的原因是,否则,信号可能会在测试sigflag == 0
和sigsuspend()
之间到达,这意味着该过程将错过信号并卡住。