繁体   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