2016-05-02 55 views
1

我試圖使我的進程waitpid()爲子進程,但也打印每隔一段時間的東西。防止SIGALRM中斷waitpid()

我目前的計劃是安排一個itimerwaitpid(),處理SIGALRM印刷,並停止該計時器waitpid()完成時。

我無法弄清楚的唯一部分是阻止SIGALRM中斷waitpid()

我查看了man頁面,沒有看到任何標誌。

想法?

回答

1

如果waitpid()回到-1errno等於EINTR剛剛重新撥打waitpid()

pid_t pid; 

while (((pid_t) -1) == (pid = waitpid(...))) 
{ 
    if (EINTR == errno) 
    { 
    continue; 
    } 

    ... 
} 

可選地(至少對於Linux)的waitpid()上的信號的接收的返回可以經由SA_RESTART標誌上安裝信號處理程序設置來避免。有關詳情,請參閱此處:http://man7.org/linux/man-pages/man7/signal.7.html

0

或者你在調用waitpid函數()之前,屏蔽信號,但隨後你的報警器將被延遲,直到暢通,或者你必須檢查waitpid函數()的返回值,並將errno爲EINTR