一个 fork 的面试题(基于自己的理解)
2012-09-03 23:38
309 查看
原文出处(可供参考!):http://www.oschina.net/question/195301_62902
原出处的代码认为不太好理解,经过自己的修改,与理解,再经过自己的实验,附上自己的说明如下:
读者可以参考APUE的p173-174的一个例子与说明,来理解。
这里只是自己的读书笔记,积累下来有备于日后的工作开发,纯属个人观点,欢迎批评指正。
前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:
题目:请问下面的程序一共输出多少个“-”?
文件名记为:shiyan-fork.c
分析:因为为printf("-\n");而非printf("-");个人认为这样比较好分析且理解。
因为\n表示换行与回车,顺理成章的输出6个"-"是可以理解的。
正如下图(图引用原出处)所示:的一个二叉树,除了二叉树的根为每个节点都产生一个"-";
但是如果进行重定向输出到一个文件为shiyan-fork.out的文件
实验结果如下:
分析:由以上结果得知,输出了8个"-";
APUEp174中第三段的第三行有一句话“如果标准输出连到终端设备,则它是行缓冲的,否则它是全缓冲的。”
因为上面为重定向输出,则是全缓冲的。
如下图(画图比较粗略,精致的图见上图):各个节点的输出的"-"的数目,一共有8个"-";因为重定向输出,二叉树的第三层的Child的节点的fork复制上面的储存空间,则第三层child的节点将产生2个"-";
按照推理,如果源代码为如下则:
实验结果:每个节只产生一个则,只有14个"-",因为是行缓冲。
如下图:
实验结果:如果是重定向则,可以产生24个"-",因为是全缓冲。
如下图:
子树的fork复制前面的数据空间到子进程,然后,自己再输出一个"-",共24个;
明白了吧!
公式就数学归纳法:有兴趣自己推推,这里就不推了。
主要弄明白(1)fork机制与(2)行缓存与全缓存机制就可以了。
原出处的代码认为不太好理解,经过自己的修改,与理解,再经过自己的实验,附上自己的说明如下:
读者可以参考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)行缓存与全缓存机制就可以了。
相关文章推荐
- 基于Nginx实现一个自己的HTTP模块
- 很全面的ios面试题以及解答,很多答案不一定全对,网上摘录以及自己的理解
- 一个fork的面试题
- 自己编写的一个基于java的socket网络聊天程序
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 一个关于fork()的面试题思路和扩展
- 刚刚在看52单片机和GPS通信程序的时候,看到了一个函数,absacc.h,貌似从来没有遇到过,百度了一下,结合自己的理解,整理如下: http://blog.sina.com.cn/s/blog_4
- 自己写的一个php基于phpQuery的通用采集类
- AMS—启动一个Activity(基于深入理解Android)
- 一个fork的面试题
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(5):数据初始化(四)
- 分享一个自己做的基于Jquery的弹出框插件
- 基于Nginx实现一个自己的HTTP模块--发送磁盘中的文件
- 刚看到一个前端面试题, 左边固定,右边自适应, 就根据自己想的自己写了下试试
- 用java做一个自己的基于XMPP协议IM(即时通讯)
- 一个fork的面试题
- 分享一个自己写的基于JQuery的一个Web背景切换的Demo
- 一个fork的面试题
- 一个fork的面试题