您的位置:首页 > 职场人生

一个 fork 的面试题(基于自己的理解)

2012-09-03 23:38 309 查看
原文出处(可供参考!):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)行缓存与全缓存机制就可以了。
 
 
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息