- 论坛徽章:
- 0
|
回复 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也去干正事。
再次感谢。 |
|