簡體   English   中英

waitpid和信號處理程序,C

[英]waitpid and signal handler, C

我試着在這篇文章中找到我的問題的答案: 信號處理程序和waitpid共存,但對我來說目前還不是很清楚。

我試着解釋我的問題:

我正在嘗試編寫一個關於父進程與其子進程之間的IPC的C程序。 父進程創建N個子進程,然后等待循環終止,如下所示:

while((pid_term = waitpid(-1, &status, 0)) != -1)

在X秒之后,父接收SIGALRM,然后通過sigaction系統調用,它捕獲警報:

struct sigaction act;
act.sa_handler = alarmHandler;
sigemptyset(&act.sa_mask);

act.sa_flags = 0;
sigaction(SIGALRM, &act, NULL);  

但是,當處理程序函數返回時,waitpid也返回-1,父進程從上面的while循環退出。 目前,處理函數有一個空體。

我問自己發生了什么 - 為什么waitpid()在處理程序調用之后返回-1,即使大多數孩子還活着? 為什么不用signal()函數發生這種情況?

sigaction建立的信號處理程序的默認行為是中斷阻塞系統調用; 如果你在警報發生后檢查errno ,你應該觀察它被設置為EINTR 這種行為幾乎不是你想要的; 它只是向后兼容性的默認值。 您可以通過在sa_flags設置SA_RESTART位來使其不這樣做:

struct sigaction act;
act.sa_flags = SA_RESTART;
act.sa_handler = alarmHandler;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, 0);

使用sigaction而不是signal的最重要原因之一是,當你使用signal時,信號處理程序是否會中斷阻塞系統調用是不可預測的 (System V譜系選擇了一個語義,BSD譜系選擇了另一個。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM