关于fork
关于fork
之前和同学讨论了一个关于fork的问题,之前自己也是稍微看过一点,但是具体的也不是太了解,这样还是很不好的。
具体的问题来源于一个面试题,大概是问 fork||fork操作会生成几个新的进程
类似的面试题,也有,比如更复杂一点的情况,参考这个:
http://blog.csdn.net/hs794502825/article/details/10242091
再简单回顾一下fork
fork主要的功能就是说,把已有的一个进程复制一个出来,这两个新的进程几乎完全是一样的。
执行fork之后,生成的两个进程每个都会启动一个从同一位置开始执行的线程,执行到fork函数中的时候,子进程就会复制父进程的堆栈段,所以两个进程实际上都陷入在fork中,还没有执行完,这样的话,fork其实可能有两种不同的返回值,一个是原先的父进程的fork执行完之后的返回值,另一个是新生成的子进程的fork得到的返回值。
当然两种返回值是不同的:
父进程中,fork函数的返回值是子进程的ID
子进程中,fork函数的返回值是0
如果出错,则返回最值是-1
可以这样理解,父进程实质上没变,多出来的子进程复制了父进程的堆栈,父进程要对其有一个引用,就像一个链表一样,因此就返回了子进程的id,而子进程没有新生成的进程可以引用,就返回了0。系统就是根据返回值来区别到底是父进程还是子进程的。
实际上在调度的时候也无法知道当前到底是父进程还是子进程,这个需要探讨更底层的实现,因此,通常用fork函数的返回值来判断到底当前是父进程还是子进程,之后再执行对应的操作。
再回顾下那个题目
就是先前列出的博客里的
第一次fork 生成了一个新的进程,此时有两个进程
第二次 fork && fork || fork 按照博客里的图,每一个最上端的父进程会生成了四个新的进程(中间有好几次是新生成的子进程又充当了父进程),开始的时候有,经过第一次的操作,有两个进程,它们分别作为最顶端的父进程,这样就生成了4+4=8个新的进程
第三次 又fork 经过了前两步的操作 已经有10个进程了 每个进程执行一次fork会新生成一个新的进程 这样就又生成了10个新的进程 于是整个过程就一共产生了 10+8+1=19 个新的进程
再这个基础上,单纯的 fork || fork 操作应该是新生成了两个进程
相关参考资料
(这个来龙去脉讲的比较透彻)http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html
关于fork的更多相关文章
- github中的watch、star、fork的作用
[转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...
- GitHub更新自己Fork的项目
转自:http://www.tuicool.com/articles/MzMJre github上有个功能叫fork,可以将别人的工程复制到自己账号下.这个功能很方便,但其有一个缺点是:当源项目更新后 ...
- Git同步原始仓库到Fork仓库中
前言 本文介绍的是Git同步原始仓库到Fork仓库示例教程,废话不多说,下面直接到实操部分. 这里以aspnetcore-doc-cn的github仓库为例,同步dev分支. 步骤 1.初始化本地仓库 ...
- github fork后的pull和保持同步
前言 对github上的某个项目贡献自己的修改,但自己可能并没有那个仓库的权限,那要如何操作呢?git的机制和svn还是有些区别的,本文做些记录. 思路1 clone项目到本地,有修改之后,直接提交到 ...
- Java使用Fork/Join框架来并行执行任务
现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...
- 为什么我们拿Fork当收藏用
刚才看OSC源创会的视频,听到 @虫虫 说:中国人喜欢拿Fork当收藏用,这对硬盘是个很大的压力.我当时很认真地笑了笑.想想好像自己也Fork了一些东西啊. 是什么因素促使我去Fork一些东西呢?我大 ...
- 【转】Linux下Fork与Exec使用
Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...
- java并行计算Fork和Join的使用
Java在JDK7之后加入了并行计算的框架Fork/Join,可以解决我们系统中大数据计算的性能问题.Fork/Join采用的是分治法,Fork是将一个大任务拆分成若干个子任务,子任务分别去计算,而J ...
- -bash: fork: retry: Resource temporarily unavailable
登陆不了服务器The server refused to start a shell. 登陆服务器后执行ls命令报错: 1 2 $ls -bash: fork: retry: Resource t ...
- Linux中fork()函数详解
一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同 ...
随机推荐
- .net Core——SqlSugar使用
一.DbContext配置 public class DbContext { public DbContext() { Db = new SqlSugarClient(new ConnectionCo ...
- The Battle of Chibi(数据结构优化dp,树状数组)
The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...
- qthread线程
一般调用quit()函数之后可以紧接着调用wait()函数确保线程退出.sleep()等让线程休眠的函数不需要调用,因为Qt中线程是事件驱动机制.但是如果是继承的QTHread类,在run()函数中使 ...
- SQL查询语句备忘录
有关于SQL查询的相关语句和语法的记录!备忘与复习用 1.SQL多表联合查询 select a.字段1,a.字段2,b,字段2 from 表1 a,表2 b where a.字段1 =b.字段1 2. ...
- 滑块QAbstractSlider
继承于 QWidget 抽象类-必须子类化 提供的范围内的整数值 QAbstractSlider import sys from PyQt5.QtWidgets import QApplication ...
- lvm磁盘扩展
pvcreate /dev/sddpvdisplay /dev/sddvgdisplayvgextend VolGroup_02 /dev/sddlvextend -L +50G /dev/mappe ...
- A1036
输入n行不同学生的name性别id和成绩,输出成绩最高的女生名字和id,成绩最低的男生名字和id求出二者的差 如果有性别缺少,输出Absent并在结果行输出NA 注意变量不要搞混,可以用结构体……不过 ...
- Cloneable接口的作用与深度克隆与浅度克隆
cloneable接口的作用 cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则 ...
- CSS盒模型面试知识点
一.基本概念 1.基本概念:标准盒模型+怪异盒模型(IE模型) 基本组成:由margin.padding.content组成. 2.标准盒模型和IE模型的区别 标准盒模型中width指的是内容区域co ...
- Bugku 杂项 telnet
letnet 下载zip后发现是一个数据包,放到wireshark中打开 右键追踪tcp流后可以发现flag