当 fork()遇上for循环, 使用fork()函数的坑,请你注意!

如果不了解什么是fork()函数,欢迎阅读我的另一篇博客
函数可以有两个返回值?初探神奇的fork()函数

warning 1

fork()函数自身不保证子进程和父进程的执行顺序

比如当我们执行几次程序就会发现

虽然每次都是先打印父进程,再打印子进程,但是两次父子进程从属关系都发生了改变

这里写图片描述

先看第一次执行的结果:

PID为2236的父进程创建了一个PID为2237的子进程

但是这里 子进程的父进程 PID变成了 1

我们知道 ,一个进程的父进程负责处理该进程的状态信息

但此时 父进程 先于 子进程结束,

该进程退出的信息无法被处理,

变成了 孤儿进程,操作系统统一为其找到一个 PID为 1 的 init “爸爸”,接管此进程

再来看第二次的结果: 子进程先结束,然后父进程再结束,所以父子关系没有被改变

所以fork并不保证父子进程的执行顺序

warning 2

子又有孙,孙又有子

我们知道fork()函数是用来创建子进程,但是如果出现了fork的嵌套,又会有什么现象呢?

code

result

结果似乎很混乱,初步结果就是 子进程又会fork()出一大堆的子进程,

如果我们画一张图,帮助我们分析,结果就会很清楚.

这里写图片描述

由图可以看出, 在 i = 0, 1 ,2 三个”时刻” 3004进程分别创建出了三个子进程
在 i = 0, 3004创建完成 3005,

当过了一时刻,来到了 i = 1的时候, 3005又会进行fork(),创建 3006进程,同时 3004创建了 3033进程

来到了 i = 2 的时刻, 3006会fork()出 3007,退出循环, 3005会fork()出3032,退出循环, 同时3033fork出 3034,退出循环, 3004 fork()出3043,退出循环

一共产生了7对 8个进程,

其实画出图很容易看出这就是一个时序问题.

这样子使用fork()是没有意义的,

我们更倾向于使用fork()一个父进程创建多个子进程.

也就是 fork()如果发现其返回值是0 或者 -1 直接结束掉循环
这里写图片描述

容易验证结果也是正确的

这里写图片描述
一道相关面试题

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值