zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    VMware NAT 静态IP模式下上网
    无法连接虚拟设备 ide1:0
    C# ContainsKey与TryGetValue方法探究
    深入讲解以太坊的数据存储
    sqlserver之查询数据插入新建表@已存在表(oracle)
    python之列表、元祖、字典和数组的使用
    python之列表、元组、字典、数组对比
    python之ConfigParser介绍
    从业人员证券交易行为合规管理测试
    window系统自动设置时间同步脚本
  • 原文地址:https://www.cnblogs.com/Goden/p/4374464.html
Copyright © 2011-2022 走看看