64,680
社区成员
发帖
与我相关
我的任务
分享
void sig_chld(int signo)
{
pid_t pid;
int stat;
printf("hello\n");
while((pid = waitpid(-1, &stat, WNOHANG)) > 0) {
printf("child %d terminated\n", pid);
}
return;
}
[/quote]
这有什么关系呢?因为你已经进入了这个循环执行waitpid了。waitpid可不需要SIGCHLD信号,只要有子进程挂了就会返回。只是说waitpid借助第一个SIGCHLD信号发挥作用。他本身处理是与SIGCHLD信号没关系。简单的说waitpid等待的不是SIGCHLD,而是子进程的死亡状态,仅此而已。
void sig_chld(int signo)
{
pid_t pid;
int stat;
printf("hello\n");
while((pid = waitpid(-1, &stat, WNOHANG)) > 0) {
printf("child %d terminated\n", pid);
}
return;
}
void sig_chld(int signo)
{
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0) {
printf("child %d terminated\n", pid);
}
return;
}
从网上copy的一段代码. wnohang的选项意味着不会阻塞一直等到某个子进程结束。那当一个子进程结束的时候进入到这个信号处理函数进行处理的时候这个时候另外一个子进程也结束了。那么意味着要重入这个处理函数了。只要这个处理函数式可重入的。那么无论有多少个子进程结束了,都会发SIGCHLD信号,都会被waitpid所处理。