当前位置:网站首页 > 技术博客 > 正文

fork函数实现原理



最近在学习计算机系统基础这门课程,老师讲到了一个神奇的函数——fork()
所以想在这里总结一下自己对fork()的简单理解

fork()函数是通过系统调用 创建一个与原来进程几乎完全相同的进程,两个进程独立存在且可以同时运行(并发),调用一次,返回两次!如果初始参数或者传入的变量不同,两个进程也可以做不同的指令。

简单点说,即fork()函数一旦被执行,则该程序就会有两条路可以同时走,先走哪条是不确定的555

在举例子之前,先来了解一下pid:(process id)当前进程的id,程序在父节点处pid>0,在子节点处pid=0,程序出错发生异常时pid=-1。
在这里插入图片描述

1. 小试牛刀,示例1:

 
  

输出结果为:
parent:x=0
child:x=2
分析:
程序开始,x初始为1,下一步遇到fork()函数,兵分两路,一路parent,另一路child,当执行parent时,pid>0,输出parent:x=0,当执行child时,pid=0,输出child:x=2
在这里插入图片描述




2、更进一步,实例2

 
  

可行的一个输出结果为:
L0
L1
Bye
Bye
L1
Bye
Bye
分析:
首先进入程序,输出L0,进入fork()函数,进程一分为二,并发进行,也就是说第一个fork()函数后面的语句要执行两遍,过程图如下
在这里插入图片描述









3、循序渐进、更上一层楼

 
  

可行的一个输出结果为:
L0
L1
Bye
Bye
L2
Bye
分析:
首先进入程序,输出L0,遇到第一个fork(),一条路直接上面的一个Bye,另一条路进入if判断,输出L1,遇到第二个fork,一条路直接到最后一个Bye,另一个输出L2,再输出Bye







在这里插入图片描述

4、 举一反三、牛刀小试,实例4

 
  

来说说你的选择吧,答案解析在文末
5、来来来、接着上

 
  

A、x=4 x=5 x=6
B、x=4 x=5 x=5
C、x=4 x=6 x=6
D、x=4 x=4 x=6
来说说你的选择吧,答案解析在文末



挑战题:
A. 考虑以下 C 程序。假设程序执行完成并且 fork、waitpid 和 printf 总是成功。
在这里插入图片描述
显示此程序的输出:
Child:sum=________
Parent:sum=________
B. 现在考虑与 A 部分相同的程序,但删除了对 waitpid 的调用。假设程序执行完成并且 printf 总是成功。不对其他函数调用的结果做任何假设。
列出此类程序的所有可能输出。每个空白框包含一次程序执行的完整输出。一些空白框可能会被闲置。
在这里插入图片描述
C. 考虑下面的 C 程序。假设程序运行完成并且所有函数都正常返回。
在这里插入图片描述
列出该程序的四种可能输出:














挑战题答案下期给出哟!!!

实例4:答案是5
解析:先调用doit(),打印第一个hello,遇到第一个fork(),第二个的fork要被执行两次,第二个fork本身就需要两次,main函数中的hello被执行了4次
在这里插入图片描述

实例5:答案是D
看图吧,很简单
在这里插入图片描述

版权声明


相关文章:

  • 代码对比工具下载2025-06-14 12:30:03
  • 机器码生成注册码工具2025-06-14 12:30:03
  • hashmap和hashtable有什么区别?2025-06-14 12:30:03
  • java中集合框架的层次结构2025-06-14 12:30:03
  • tinyxml2创建xml文件2025-06-14 12:30:03
  • sql server中触发器的作用是什么?2025-06-14 12:30:03
  • 推荐系统算法代码2025-06-14 12:30:03
  • pandas自定义聚合函数2025-06-14 12:30:03
  • tf存储原理2025-06-14 12:30:03
  • 数据库database2025-06-14 12:30:03