我fork了多个子进程以后,如何能wait它们所有?
例如,我fork了10个子进程,返回的pid_t放到一个有10个元素的pid_t数组里面。那么:
我如果简单的写一个for循环,来遍历并调用waitpid的话,前一个进程还在运行,后一个进程已经退出了,那么就相当于后一个进程退出以后一直处于僵尸状态,直到我的父进程已经为前一个进程调用过了waitpid
有没有什么好一点的办法能让我比较优雅的wait所有的子进程呢?
谢谢。
回复 1# sentto2
请看一下函数的说明,其中pid这个参数介绍如下:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。
所以,你可以pid为-1,则等待任一一个子进程结束 waitpid非阻塞回收任意子进程即可。 借用网上一段代码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
asdf2110 发表于 2015-04-22 08:52 static/image/common/back.gif
借用网上一段代码回复 1# sentto2
waitpid和wait函数本身就是等待SIG_CHILD信号来到,然后才能返回的吧。
这段程序自己处理了SIG_CHILD,然后在处理函数中再次调用waitpid,那么waitpid还能返回吗? 因为SIG_CHILD已经被处理了。
可能我的理解是错的,但还是疑惑 wait nohang:lol 是先触发 SIGCHLD 信号,然后转到信号处理函数中去处理;
当然也可以不编写信号处理函数,直接丢给 init 进程去回收,就是把信号处理函数换成 SIG_IGN
singal(SIGCHLD, SIG_IGN)
回复 5# sentto2
asdf2110 发表于 2015-04-22 13:29 static/image/common/back.gif
是先触发 SIGCHLD 信号,然后转到信号处理函数中去处理;
当然也可以不编写信号处理函数,直接丢给 init 进 ...
我的问题在于: 既然wait函数是需要等待信号来到的,那么信号处理函数已经是得到了信号之后的事情了,此时wait拿不到信号,对吧? 那wait函数如何能返回呢? 父进程循环wait即可,如果没有需要wait的子进程,wait函数会自动返回-1,即结束循环。
while((pid = wait(&stat)) > 0){
printf("child %d terminated\n", pid);
} 回复 5# sentto2
wait并不是阻塞于SIGCHLD信号,他本身不会捕获SIGCHLD信号,他应该是不断轮询子进程队列,一旦找到一个满足条件的僵死子进程,他就会返回。
页:
[1]