免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: apor
打印 上一主题 下一主题

求apue一段解释 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-04-22 15:58 |只看该作者
回复 4# cokeboL

这个不一定先返回子进程吧。
父进程没有设wait,它就没办法判断子进程何时结束,又怎么断定自己比子进程后返回的呢。
只有当使用vfork的时候,父进程才会等待子进程终止。

论坛徽章:
0
12 [报告]
发表于 2011-04-22 16:03 |只看该作者
回复 10# crazyhadoop


    没有啊。我说的这句话里不存在A。
我不用B跟C这字眼了。
用A跟B行不。
A fork B ,A exit (without wait(B)). //A不是僵尸,更没有等待B
B controled by init ..// B不会成为僵尸,它被init回收。

我是说这样子已经达到了文中的两项要求 :1 不等子进程,2没有僵尸。

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
13 [报告]
发表于 2011-04-22 16:18 |只看该作者
回复 12# apor


                除非保证父进程先于子进程结束或者保证父进程在子进程结束前执行waitpid(), 若子进程退出的时候,父进程没有调用wait函数,(至于谁先执行,可不受控啊,)那子进程状态就流失了。僵尸到父进程被杀死,init接管他。 若父进程是个长期运行的程序,子进程就僵尸了不是?

论坛徽章:
0
14 [报告]
发表于 2011-04-22 16:40 |只看该作者
回复 13# crazyhadoop

apue提供的程序之中,抛却A不管,B和C的情况不是跟我说的一样么?有区别?
C是通过sleep(2)来基本保证父进程B先退出的吧。

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
15 [报告]
发表于 2011-04-22 16:53 |只看该作者
回复  crazyhadoop

apue提供的程序之中,抛却A不管,B和C的情况不是跟我说的一样么?有区别?
C是通过 ...
apor 发表于 2011-04-22 16:40



    C调用sleep确实是为了让B先退出,要不打印的可能是B的pid, init还没接管他呢。

    不能抛弃A不管啊~  B 还得靠A接管状态呢。

论坛徽章:
0
16 [报告]
发表于 2011-04-22 17:01 |只看该作者
本帖最后由 apor 于 2011-04-22 17:03 编辑

回复 15# crazyhadoop

你前面的贴子是说我的思路里A被个父进程跟B这个子进程,谁选退出没定论所有B可能成为僵尸。那么。
  在书里的思路里,我的抛弃A是指:B这个父进程跟C这个子进程,谁先退出的问题。跟我的思路里难道不是一样的问题?
拜托大哥认真看一下我的贴子。我从第一贴开始就在说这个问题,大家都没瞧见。一路走到这十几楼了。真不知道咱们是不是一个星球的...

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
17 [报告]
发表于 2011-04-22 17:34 |只看该作者
本帖最后由 cokeboL 于 2011-05-17 16:33 编辑

回复 16# apor

  楼主想问的大概是一次fork和两次fork都实现了没有僵尸进程的,他们有什么区别、何必多此一举对吗?
  我第一个回复说过了,把A当做服务,因为fork子进程的情况多是A作为服务器,然后需要创建多个子进程分别执行不同的任务。但子进程又不知道什么时候退出,这样如果由A本身来回收的话就很麻烦,或者阻塞或者waitpid之类都比twice fork要麻烦。

  个人觉得这个技巧关键在于A应该是作为服务器的情况,以及子进程退出时间的不确定性,而不是单从语法或逻辑角度考虑。
  不知道对不对。

论坛徽章:
0
18 [报告]
发表于 2011-04-22 18:40 |只看该作者
回复 17# cokeboL


    谢谢,这次是说明白了。不过我总结一下,也算是结贴吧。
首先感谢crazyhadoop兄,他提出了父进程如果不wait子进程,那么父进程必须要保证先于子进程而退出。我想这点加深了我对于僵尸的理解。之前 我不是清楚这事的。
还要感谢cokeboL兄,他指出了书中的意思。

对于A是有这样的要求的,新建 一个进程,不wait(),但同时保证子进程不变为僵尸。这种情况下,使用A fork B, A exit immediately, B controled by A是可以实现这两个目的的,当然要保证A比B先退出,需要在B中一开始进行sleep。
-------------
然而,关键的问题是,我们不仅是要A达到上面的要求,还需要A并不退出。即A不wait,且不立即退出,还要同时保证子进程不变为僵尸。实际是三个要求。为什么是三个要求,而不是字面意思上的两条要求。正如cokeboL兄所说的那样,这种情况下,A是一般做为一个服务的,岂能随意退出,它在fork完一个子进程之后,还有许多其它任务要完成,可能还要fork若干其它子进程,所以:一、A进程是要常驻的,多半要晚于子进程退出。二、A不wait()子进程,因为很难判断子进程何时结束,A总不能停下来不干活光等子进程去了。三、A即不等,又不会先于子进程退出,那么子进程很可能成为僵尸。

为达到上述 三条要求,才需要用到twice fork技巧,即A创建一个中间进程B并wait(B),B创建目标进程C然后立即退出,A回收B,A去干正事,C由init接管,C也去干正事。

再次感谢。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
19 [报告]
发表于 2011-04-22 18:59 |只看该作者
回复 18# apor


    楼主的问题很好,也让我记住了一个技巧,而且讨论得来比一般看书记得更深刻。

   感谢楼主!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP