2011-06-28 50 views
1

假設有兩個進程(一個父進程和一個子進程),它們使用該信號進行同步。在父進程中,用於與子進程同步的函數如下所示。在進程間通信中使用時暫停()和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.... 
} 

我的問題是,我們可以使用pause()更換sigsuspend(&zeromask)

回答

4

否。如果主要信號掩碼阻塞了孩子發送的信號,則發佈的代碼只有競賽條件自由,如果是這種情況,那麼由於pause()不會更改信號掩碼,所以它會永遠阻止。

信號必須被初始阻斷的原因是否則信號可能在測試sigflag == 0sigsuspend()之間到達,這意味着該過程將錯過信號並卡住。