1

我试图在这篇文章中找到我的问题的答案:信号处理程序和 waitpid 共存但对我来说目前还不是很清楚。

我试图解释我的问题:

我正在尝试编写一个涉及父进程及其子进程之间 IPC 的 C 程序。父进程创建 N 个子进程,然后在这样的循环中等待终止:

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

X 秒后,parent 收到 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()

4

1 回答 1

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 沿袭选择了另一种。)

于 2017-12-27T17:29:00.620 回答