关于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的更多相关文章

  1. github中的watch、star、fork的作用

    [转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...

  2. GitHub更新自己Fork的项目

    转自:http://www.tuicool.com/articles/MzMJre github上有个功能叫fork,可以将别人的工程复制到自己账号下.这个功能很方便,但其有一个缺点是:当源项目更新后 ...

  3. Git同步原始仓库到Fork仓库中

    前言 本文介绍的是Git同步原始仓库到Fork仓库示例教程,废话不多说,下面直接到实操部分. 这里以aspnetcore-doc-cn的github仓库为例,同步dev分支. 步骤 1.初始化本地仓库 ...

  4. github fork后的pull和保持同步

    前言 对github上的某个项目贡献自己的修改,但自己可能并没有那个仓库的权限,那要如何操作呢?git的机制和svn还是有些区别的,本文做些记录. 思路1 clone项目到本地,有修改之后,直接提交到 ...

  5. Java使用Fork/Join框架来并行执行任务

    现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...

  6. 为什么我们拿Fork当收藏用

    刚才看OSC源创会的视频,听到 @虫虫 说:中国人喜欢拿Fork当收藏用,这对硬盘是个很大的压力.我当时很认真地笑了笑.想想好像自己也Fork了一些东西啊. 是什么因素促使我去Fork一些东西呢?我大 ...

  7. 【转】Linux下Fork与Exec使用

    Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...

  8. java并行计算Fork和Join的使用

    Java在JDK7之后加入了并行计算的框架Fork/Join,可以解决我们系统中大数据计算的性能问题.Fork/Join采用的是分治法,Fork是将一个大任务拆分成若干个子任务,子任务分别去计算,而J ...

  9. -bash: fork: retry: Resource temporarily unavailable

    登陆不了服务器The server refused to start a shell. 登陆服务器后执行ls命令报错:   1 2 $ls -bash: fork: retry: Resource t ...

  10. Linux中fork()函数详解

    一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同 ...

随机推荐

  1. vim小白练习记录

    1.vim卡死  按ctrl+s键后 vim卡死,按任何键不管用,按ctrl+q恢复

  2. 文本检错——中文拼写检查工具FASPell

    最近因为相关项目需要考虑中文文本检错,然后就发现了爱奇艺发布的号称SOTA的FASPell已经开源代码,所以开始着手实现. 检错思想两步:一,掩码语言模型(MLM)产生候选字符:二,CSD过滤候选字符 ...

  3. apply()的使用

    apply()方法的另一种使用,就是可以代替一次for循环 在封装 document.getElementsByTagName的时候,需要把伪数组转为一个真的数组,其是也不是真的数组 typeof 出 ...

  4. telnet ip 端口

    telnet ip 端口 1.关闭防火墙, 2.配置防火墙,出入端规则

  5. mysql Alias操作符 语法

    mysql Alias操作符 语法 作用:为列名称和表名称指定别名 大理石构件 语法:SELECT column_name(s) FROM table_name AS alias_name mysql ...

  6. 在asp.net 中怎样上传文件夹

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  7. 【bzoj3195】【 [Jxoi2012]奇怪的道路】另类压缩的状压dp好题

    (上不了p站我要死了) 啊啊,其实想清楚了还是挺简单的. Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期 ...

  8. es分片shard的数量

    适当的提升分片数量可以提升建立索引的速度: 一般情况下:一个索引库建立5-20个分片是最合适的: 注意:如果分片过少或者过多,都会降低检索的速度 分片数过多会导致: 1. 会导致打开比较多的文件2. ...

  9. [CSP-S模拟测试]:寿司(暴力)

    题目描述 小$c$是一名$oier$.最近,他发现他的数据结构好像学傻了.因为他在刷题时碰到了一道傻逼数据结构题,强行使用了平衡树来解决,卡着时间$AC$.为此,他被狠狠地嘲讽了一番.于是,小$c$找 ...

  10. Codeforces Gym 100269 Dwarf Tower (最短路)

    题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game na ...