sentto2 发表于 2015-04-18 17:06

我fork了多个子进程以后,如何能wait它们所有?

例如,我fork了10个子进程,返回的pid_t放到一个有10个元素的pid_t数组里面。
那么:
我如果简单的写一个for循环,来遍历并调用waitpid的话,前一个进程还在运行,后一个进程已经退出了,那么就相当于后一个进程退出以后一直处于僵尸状态,直到我的父进程已经为前一个进程调用过了waitpid

有没有什么好一点的办法能让我比较优雅的wait所有的子进程呢?
谢谢。

羽剑天涯 发表于 2015-04-18 22:03

回复 1# sentto2


    请看一下函数的说明,其中pid这个参数介绍如下:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。
    所以,你可以pid为-1,则等待任一一个子进程结束

linux_c_py_php 发表于 2015-04-21 11:27

waitpid非阻塞回收任意子进程即可。

asdf2110 发表于 2015-04-22 08:52

借用网上一段代码void sig_chld(int signo)
{
       pid_t   pid;
       int   stat;
      
       while((pid = waitpid(-1, &stat, WNOHANG)) > 0){
               printf("child %d terminated\n", pid);
       }
      return;
} 回复 1# sentto2


   

sentto2 发表于 2015-04-22 09:12

asdf2110 发表于 2015-04-22 08:52 static/image/common/back.gif
借用网上一段代码回复 1# sentto2

waitpid和wait函数本身就是等待SIG_CHILD信号来到,然后才能返回的吧。
这段程序自己处理了SIG_CHILD,然后在处理函数中再次调用waitpid,那么waitpid还能返回吗? 因为SIG_CHILD已经被处理了。

可能我的理解是错的,但还是疑惑

流氓无产者 发表于 2015-04-22 09:28

wait nohang:lol

asdf2110 发表于 2015-04-22 13:29

是先触发 SIGCHLD 信号,然后转到信号处理函数中去处理;
当然也可以不编写信号处理函数,直接丢给 init 进程去回收,就是把信号处理函数换成 SIG_IGN
singal(SIGCHLD, SIG_IGN)

回复 5# sentto2


   

sentto2 发表于 2015-04-22 19:56

asdf2110 发表于 2015-04-22 13:29 static/image/common/back.gif
是先触发 SIGCHLD 信号,然后转到信号处理函数中去处理;
当然也可以不编写信号处理函数,直接丢给 init 进 ...
我的问题在于: 既然wait函数是需要等待信号来到的,那么信号处理函数已经是得到了信号之后的事情了,此时wait拿不到信号,对吧? 那wait函数如何能返回呢?

busky 发表于 2015-07-13 16:42

父进程循环wait即可,如果没有需要wait的子进程,wait函数会自动返回-1,即结束循环。

while((pid = wait(&stat)) > 0){
               printf("child %d terminated\n", pid);
       }

superlike01 发表于 2015-07-22 13:37

回复 5# sentto2

wait并不是阻塞于SIGCHLD信号,他本身不会捕获SIGCHLD信号,他应该是不断轮询子进程队列,一旦找到一个满足条件的僵死子进程,他就会返回。
   
页: [1]
查看完整版本: 我fork了多个子进程以后,如何能wait它们所有?