waitpid和信号处理程序,C

时间:2017-12-27 17:19:03

标签: c ipc waitpid sigaction

我试着在这篇文章中找到我的问题的答案:Signal handler and waitpid coexisting但对我来说目前还不是很清楚。

我试着解释我的问题:

我试图在父流程及其子进程之间编写一个涉及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()函数不会发生这种情况?

1 个答案:

答案 0 :(得分:3)

sigaction建立的信号处理程序的默认行为是中断阻塞系统调用;如果您在闹钟触发后检查errno,则应将其设置为EINTR。这种行为几乎不是你想要的;它只是向后兼容性的默认值。您可以通过设置SA_RESTART中的sa_flags位来执行此操作:

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谱系选择了另一个。)