Linux中加深理解fork的小例子

关于fork的详细解释

  fork是Linux中用来创建与父进程相同子进程的系统调用函数,他创建一个原有进程的精确副本,包括所有的文件描述符,寄存器等全部内容。在fork之后,原有的进程及其副本(父与子)就分开了。在fork时,所有的变量具有一样的值,虽然父进程的数据被复制用以创建子进程,但是其中一个的后续变化并不会影响到另一个,两个进程就是独立个体,各自运行,互不干扰,父子进程谁先执行不由fork决定,而是由系统当前环境和进程调度算法决定,所以程序出来结果的顺序是不确定的。

  子进程是从调用fork以后的代码开始执行的,fork调用一次会返回两个值,其中在子进程中返回0,在父进程中返回子进程的pid号

  下面给大家举三个例子:

   程序一:

                       

  同学们,可以先根据程序,并依据我上面所说的知识点,猜测一下运行结果

  最后运行的结果是:

                      

  我们可以看到程序既输出了world,又输出了hello,而其中world和hello分别是同一个if函数中if和else中的值,不可能同时打出,那现在竟然出现了这样的结果,是什么原因呢?

  其实,正如我们上面所说,子进程是从调用fork以后的代码开始执行的,fork调用一次会返回两个值,其中在子进程中返回0,在父进程中返回子进程的pid号,父进程中的返回值是非0值,因此父进程打出world,而子进程中因为返回值是0,因此打出hello,所以既打出了world又打出了hello,但调用fork结束以后,两个进程就是独立个体,各自运行,互不干扰父子进程谁先执行不由fork决定,而是由系统当前环境和进程调度算法决定,因此根据个人系统情况不同,打出world和hello的顺序不一定一致,我们只能确定运行出来的结果,但没办法确定运行结果出来的顺序。

程序二:

                         

运行结果:

                        

  这个程序,比上面的程序复杂一些,因此,我给大家画图进行讲解。

 因此,结果是“A”,“B”,“B”。

程序三:

                       

运行过程:

                      

  这个过程也较为复杂,我也画图解释。

 

它的结果是BBABAA,顺序不能确定,因为这是根据系统当前环境和进程调度算法决定。

以上是我对fork函数的小结,大家可以提出我对不足,或讲一件自己的看法,我们可以讨论一下,扬长补短,谢谢大家!

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值