while((pid = waitpid(-1, &stat, WNOHANG)) > 0)不明白的地方
static void sig_handler(int signo){
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0){
printf("child %ld terminated......\n", (long)pid);
}
}
UNIX对信号是不排队的,当5个子进程同时结束,产生5个SIGCHLD信号,提交到父进程,父进程只看成是一个SIGCHLD信号,为何用while就可以捕获到所有发出SIGCHLD信号的子进程?不是只有一个SIGCHLD信号了吗? 看这个:
http://bbs.chinaunix.net/thread-828942-1-1.html 只要能收到最后一个SIGCHLD就可以处理之前所有结束的子进程状态。。。。 能确认是子进程同时退出吗? 原帖由 shaoxia 于 2008-10-29 15:03 发表 http://bbs3.chinaunix.net/images/common/back.gif
能确认是子进程同时退出吗?
不能 原帖由 alexhappy 于 2008-10-29 14:57 发表 http://bbs3.chinaunix.net/images/common/back.gif
只要能收到最后一个SIGCHLD就可以处理之前所有结束的子进程状态。。。。
3楼是正解,确实没有对SIGCHLD进行排队,如果有5个子进程结束,父进程会收到1个信号,信号处理函数中while就会循环n次,把所有结束的子进程处理掉,直到没有已经结束的进程。
回复 #2 scutan 的帖子
受教了,flw说的很好!谢谢! 也算搞懂了waitpid的用法了
页:
[1]