一个 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)行缓存与全缓存机制就可以了。
 
 
 
 
 
 
 
 
 
原创粉丝点击