2011-06-28 14 views
1

親と子の2つのプロセスがあり、これらのプロセスが同期用に信号を使用しているとします。親プロセスでは、子プロセスと同期するための関数が以下のように動作します。プロセス間通信でpause()とsigsuspend()を使用する場合

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.... 
} 

私の質問は、私たちがsigsuspend(&zeromask)を置き換えるためにpause()を使用することができますか?

答えて

4

いいえ。投稿されたコードは、優勢な信号マスクが子供によって送信された信号をブロックしている場合にのみ競合状態がなく、pause()は信号マスクを変更しないので、永遠にブロックされます。

信号が最初にブロックされなければならない理由は、信号がテストsigflag == 0sigsuspend()の間に到着する可能性があります。つまり、プロセスが信号を失い、スタックしてしまうことになります。

関連する問題