关于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