再次理解fork()

 和ctq讨论后,从这段代码理解了fork()函数。

运行结果如下:

从执行结果看,这段代码共产生了4个进程。

因为每执行一次fork(),会分裂成两个进程。也就是说,总的进程数关于fork()的调用次数成指数级增长。

第一步,“爷爷进程”(pid=7538)走到第10行,执行fork()。那么从此处分裂成两个进程。处理机调度爷爷进程(pid=7538),那么爷爷进程就接着10行往下执行。在此进程中,行10的fork()返回给7538爷爷进程的pid1为刚刚他生出的子进程的pid,即7539。接着,执行第11行,再次分裂,产生子进程7540,处理机还是先调度爷爷进程。爷爷进程执行第13行。

然后,爷爷进程被销毁。

处理机开始调度pid为7539的子进程,暂时称其为父亲进程(在三代进程中,相对而言)。该进程从第10行被创建的地方往下执行。由于该进程是被创建的子进程,所以在他内部,fork()返回给pid1的值为0。接着执行11行,分裂,产生新进程7541。先调度父亲进程7539,执行13行。由于它的父进程7538在前面已经被销毁,所以它被系统缺省进程pid=1领养。然后进程7539退出,销毁进程7539。


接着,调度进程7541。

最后,调度进程7540。分析同前面一样。

而输出结果中,爷爷进程7538的父进程7236,就是bash咯。这个通过终端$top -p 7236可以查到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值