[英]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.