免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9530 | 回复: 9
打印 上一主题 下一主题

[Linux] 我fork了多个子进程以后,如何能wait它们所有? [复制链接]

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-18 17:06 |只看该作者 |倒序浏览
例如,我fork了10个子进程,返回的pid_t放到一个有10个元素的pid_t数组里面。
那么:
我如果简单的写一个for循环,来遍历并调用waitpid的话,前一个进程还在运行,后一个进程已经退出了,那么就相当于后一个进程退出以后一直处于僵尸状态,直到我的父进程已经为前一个进程调用过了waitpid

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2015-04-18 22:03 |只看该作者
回复 1# sentto2


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

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2015-04-21 11:27 |只看该作者
waitpid非阻塞回收任意子进程即可。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
4 [报告]
发表于 2015-04-22 08:52 |只看该作者
借用网上一段代码
  1. void sig_chld(int signo)
  2. {
  3.        pid_t   pid;
  4.        int     stat;
  5.         
  6.        while((pid = waitpid(-1, &stat, WNOHANG)) > 0){
  7.                printf("child %d terminated\n", pid);
  8.        }
  9.         return;
  10. }
复制代码
回复 1# sentto2


   

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:53:22
5 [报告]
发表于 2015-04-22 09:12 |只看该作者
asdf2110 发表于 2015-04-22 08:52
借用网上一段代码回复 1# sentto2


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

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

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
6 [报告]
发表于 2015-04-22 09:28 |只看该作者
wait nohang

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
7 [报告]
发表于 2015-04-22 13:29 |只看该作者
是先触发 SIGCHLD 信号,然后转到信号处理函数中去处理;
当然也可以不编写信号处理函数,直接丢给 init 进程去回收,就是把信号处理函数换成 SIG_IGN
singal(SIGCHLD, SIG_IGN)

回复 5# sentto2


   

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:53:22
8 [报告]
发表于 2015-04-22 19:56 |只看该作者
asdf2110 发表于 2015-04-22 13:29
是先触发 SIGCHLD 信号,然后转到信号处理函数中去处理;
当然也可以不编写信号处理函数,直接丢给 init 进 ...

我的问题在于: 既然wait函数是需要等待信号来到的,那么信号处理函数已经是得到了信号之后的事情了,此时wait拿不到信号,对吧? 那wait函数如何能返回呢?

论坛徽章:
0
9 [报告]
发表于 2015-07-13 16:42 |只看该作者
父进程循环wait即可,如果没有需要wait的子进程,wait函数会自动返回-1,即结束循环。

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

论坛徽章:
0
10 [报告]
发表于 2015-07-22 13:37 |只看该作者
回复 5# sentto2

wait并不是阻塞于SIGCHLD信号,他本身不会捕获SIGCHLD信号,他应该是不断轮询子进程队列,一旦找到一个满足条件的僵死子进程,他就会返回。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP