在进程间通信中使用pause()和sigsuspend()

时间:2011-06-28 04:41:22

标签: c linux signals

假设有两个进程,父进程和子进程,它们使用信号进行同步。在父进程中,用于与子进行同步的函数的行为如下所示。

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)吗?

1 个答案:

答案 0 :(得分:4)

没有。如果主要信号掩码阻止了孩子发送的信号,则发布的代码只有竞争条件,如果是这种情况,那么,因为pause()不会改变信号掩码,它会阻止永远。

信号必须最初被阻止的原因是,否则,信号可能会在测试sigflag == 0sigsuspend()之间到达,这意味着该过程将错过信号并卡住。