capable 发表于 2008-10-29 14:22

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信号了吗?

scutan 发表于 2008-10-29 14:51

看这个:
http://bbs.chinaunix.net/thread-828942-1-1.html

alexhappy 发表于 2008-10-29 14:57

只要能收到最后一个SIGCHLD就可以处理之前所有结束的子进程状态。。。。

shaoxia 发表于 2008-10-29 15:03

能确认是子进程同时退出吗?

alexhappy 发表于 2008-10-29 15:06

原帖由 shaoxia 于 2008-10-29 15:03 发表 http://bbs3.chinaunix.net/images/common/back.gif
能确认是子进程同时退出吗?
不能

carl_lau 发表于 2008-10-29 15:15

原帖由 alexhappy 于 2008-10-29 14:57 发表 http://bbs3.chinaunix.net/images/common/back.gif
只要能收到最后一个SIGCHLD就可以处理之前所有结束的子进程状态。。。。
3楼是正解,确实没有对SIGCHLD进行排队,如果有5个子进程结束,父进程会收到1个信号,信号处理函数中while就会循环n次,把所有结束的子进程处理掉,直到没有已经结束的进程。

capable 发表于 2008-10-29 16:36

回复 #2 scutan 的帖子

受教了,flw说的很好!谢谢!

zwylinux 发表于 2008-10-29 17:07

也算搞懂了waitpid的用法了
页: [1]
查看完整版本: while((pid = waitpid(-1, &stat, WNOHANG)) > 0)不明白的地方