一个 fork 的面试题(基于自己的理解)
来源:互联网 发布:vue.js app 编辑:程序博客网 时间:2024/06/06 22:15
原文出处(可供参考!):http://www.oschina.net/question/195301_62902
原出处的代码认为不太好理解,经过自己的修改,与理解,再经过自己的实验,附上自己的说明如下:
读者可以参考APUE的p173-174的一个例子与说明,来理解。
这里只是自己的读书笔记,积累下来有备于日后的工作开发,纯属个人观点,欢迎批评指正。
前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:
题目:请问下面的程序一共输出多少个“-”?
#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(void){ int i; for(i=0; i<2; i++) { fork(); printf("-\n"); } return 0;}
文件名记为:shiyan-fork.c
[root@hxyshiyan-fork]#vi shiyan-fork.c[root@hxyshiyan-fork]#gcc -g -o shiyan-fork shiyan-fork.c[root@hxyshiyan-fork]#./shiyan-fork------
分析:因为为printf("-\n");而非printf("-");个人认为这样比较好分析且理解。
因为\n表示换行与回车,顺理成章的输出6个"-"是可以理解的。
正如下图(图引用原出处)所示:的一个二叉树,除了二叉树的根为每个节点都产生一个"-";
但是如果进行重定向输出到一个文件为shiyan-fork.out的文件
实验结果如下:
[root@hxyshiyan-fork]#./shiyan-fork > shiyan-fork.out [root@hxyshiyan-fork]#cat shiyan-fork.out --------
分析:由以上结果得知,输出了8个"-";
APUEp174中第三段的第三行有一句话“如果标准输出连到终端设备,则它是行缓冲的,否则它是全缓冲的。”
因为上面为重定向输出,则是全缓冲的。
如下图(画图比较粗略,精致的图见上图):各个节点的输出的"-"的数目,一共有8个"-";因为重定向输出,二叉树的第三层的Child的节点的fork复制上面的储存空间,则第三层child的节点将产生2个"-";
按照推理,如果源代码为如下则:
#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(void){ int i; for(i=0; i<3; i++) { fork(); printf("-\n"); } return 0;}
实验结果:每个节只产生一个则,只有14个"-",因为是行缓冲。
[root@hxyshiyan-fork]#vi shiyan-fork.c[root@hxyshiyan-fork]#gcc -g -o shiyan-fork shiyan-fork.c[root@hxyshiyan-fork]#./shiyan-fork--------------
如下图:
实验结果:如果是重定向则,可以产生24个"-",因为是全缓冲。
[root@hxyshiyan-fork]#./shiyan-fork > shiyan-fork.out [root@hxyshiyan-fork]#cat shiyan-fork.out ------------------------
如下图:
子树的fork复制前面的数据空间到子进程,然后,自己再输出一个"-",共24个;
明白了吧!
公式就数学归纳法:有兴趣自己推推,这里就不推了。
主要弄明白(1)fork机制与(2)行缓存与全缓存机制就可以了。
- 一个 fork 的面试题(基于自己的理解)
- 一个 fork 的面试题
- 一个 fork 的面试题
- 一个 fork 的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- 一个fork的面试题
- ICE笔记(08):C++线程与并发
- MySQL日志文件
- vim学习笔记系列之----移动
- spring-hibernate
- HOJ 1081 Scramble Sort
- 一个 fork 的面试题(基于自己的理解)
- 怎么更容易记住y = x++ 与 y = ++x的区别
- Oracle并发控制中的乐观锁
- 黑马程序员——BufferedReader,BufferedWriter介绍及复制文本文件
- [android]数组资源
- Ice笔记--C++线程与并发(二)
- 大话PHP之性能
- 只要是在公司“混”,此文对新人&旧人都有好处!
- Oracle学习笔记--range/rows