题目

阅读下面的代码,显示终端会打印出几个 hello world?

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main()
{fork();fork();fork();printf("hello world\n");exit(0);
}

答案是多少呢?我们一起分析一下。

原理分析

关于 fork

fork() 函数会创建一个新的子进程。子进程得到与父进程用户级虚拟地址空间相同的一份副本,包括代码段数据段、堆、共享库、用户栈等。

fork 调用一次,返回两次:一次是返回到父进程。一次是返回到新创建的子进程。调用返回后,父进程和子进程各自继续执行后边的指令。

父进程和子进程并发独立运行,内核能够以任意方式交替执行它们的指令。

父进程和子进程有相同但是独立的地址空间。

父进程和子进程之间共享文件。即子进程会继承父进程所有打开的文件。

fork 嵌套分析

我们可以通过画图,来理解带有嵌套 fork 调用的程序。

为了方便看出是哪个 fork 执行,在图中用标号进行了标注。

第一个 fork 执行了 1 次。第二 fork 执行了 2 次,第三个 fork 执行了 4 次。最终有 8 个进程运行程序。

从而 printf 函数被调用了 8 次。

结果

根据以上分析可知,代码最终打印 8 次 hello world。

我们可以在 PC 上验证一下,编译、执行后的输出结果:

$ gcc fork.c
$ ./a.out
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

实际结果与分析相同。

看来 fork() 不仅要会用,还要理解其背后的原理,还有就是掌握分析问题的方法。

如此,才能在遇到的问题的时候,从容不迫。

加油~

一道关于 fork 的笔试题相关推荐

  1. java笔试题_一道简单的 Java 笔试题,但值得很多人反思

    专注于Java领域优质技术,欢迎关注 作者:匿蟒 前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问 ...

  2. 分享一道蚂蚁金服笔试题

    之前有个朋友面试蚂蚁金服p7,他的笔试题我要了过来,我觉得这道题目还是比较经典的,有兴趣的朋友不妨先拿来热热身. 实现转账系统,给外部系统提供账户开户,充值,转账rpc服务,要求如下,- 账户类设计: ...

  3. 【转】一个关于fork()的笔试题,考了好几遍,终于找到答案了

    笔试至少3次见到这个题,都是瞎编的,今天群里有人问,然后有人放出了这个地址:http://coolshell.cn/articles/7965.html,让我恍然大明白,豁然好脾气. 感谢这位陈皓同学 ...

  4. python 数据类笔试题_一道 Python 类的笔试题详解

    r = {} class C(object): def __init__(self, a, b): self.a = a self.b = b if b == 'a': orig = super(C, ...

  5. 一道有趣的微软笔试题

    老师d 的物理测验答案在教室里丢失了,今天那个教室上了5 堂课,老师d 上了3 堂,有可 能是a.b.c 三个同学盗窃 已知:1.a 上了两堂课 2.b 上了三堂课 3.c 上了四堂课 4.a.b.c ...

  6. 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...

    难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...

  7. 软件测试5分钟解决银行借贷笔试题

    在网上看到这样一道题 同学们面试的时候,80%的同学总是会被要求做笔试题,而笔试题中的重中之重就是:用例设计题. 用例设计题的方法离不开这4大方法:等价类.边界值.错误推测法.场景法.所以任何用例设计 ...

  8. 一道指针压轴笔试题讲解 (进阶指针必看)

    今天我来给大家讲解一道指针压轴笔试题,同时也是进阶指针知识必会的一道题.相信大家在认真梳理清楚这道题后,对指针的知识了解定会更上一层楼 ~ 话不多说,上题目 : 请问程序输出结果是什么 ? 相信大家一 ...

  9. 给定一个数值,输出符合中国人习惯的读法--记一道笔试题

    题目:给定一个数字,最大小于一万亿,输出符合中国人习惯的读法,例如: a.12输出:十二 b.102输出:一百零二 c.1002输出:一千零二 d.112输出:一百十二 e.10112输出:一万零一百 ...

最新文章

  1. 在数据库恢复之前将数据库置为单用户模式
  2. 念 2013-8-6 (写于爸爸走之后,之七)
  3. 分享一下cookies操作(增、删、改、查)小经验
  4. 概念设计师凌云:《蜘蛛侠:平行宇宙》和《证人》美术浅析
  5. 印度电工,真牛!上天入海,无所不能...
  6. 如何配置能让fiddler抓去https的请求?
  7. 看了新闻,思科研发中心 没有成都的。。。
  8. 常用的python脚本_五个python常用运维脚本面试题实例
  9. python 操作系统学习_操作系统学习
  10. 阿里云搭建图片服务器,图片资源服务器搭建
  11. 事情又没有后续,吾真想质问头目,汝是为吾干活吗?
  12. 杨志便嗔道 瑞星杀毒软件序列号
  13. java代码混淆(使用 ProGuard maven插件)
  14. 单干必备:论嵌入式模块化编程、驱动分离的重要性
  15. 【机器学习】10:朴素贝叶斯做文本分类
  16. 资源调度有什么技术难点?
  17. OSChina 周五乱弹 ——程序猿到底算不算歧视
  18. 1025 反转链表 (25 分)
  19. genicam 相机java,机器视觉必知-GenICam相机通用接口标准
  20. 【Python】Python之end()关键字使用

热门文章

  1. Linux 灾难恢复 Linux 系统启动故障修复
  2. linux ssh密钥登录配置
  3. 读c语言深度剖析 -- 单引号与双引号、逻辑运算符、位运算符、花括号
  4. python量化数据处理小细节(以后还会不断补充)
  5. java继承中的方法覆盖问题
  6. 数据结构中的逻辑结构简介
  7. fscanf()php,fscanf函数的用法
  8. 算法基础之搜索和经典排序
  9. python之虚拟环境
  10. Java基础中按值传递和引用传递详解