Friday, July 19, 2013

一个fork()的面试题

这几天面试,遇到这么一个问题。

请问下面程序输出多少个'-'

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 
 4 #define N 2
 5 
 6 int
 7 main(void)
 8 {
 9     for (int i = 0; i < N; i++) {
10         fork();
11         printf("-");
12     }
13     return 0;
14 }

回来仔细思考一下,发现这个问题其实并不难,关键是创建了多少个进程,每个进程都会 输出2个'-', 要想清楚这个需要知道fork()系统调用的两个特性:

  1. fork()系统调用会*nix下进程以自身为原本创建的一个派生进程(我们称「子进程」),fork()一次调用,两次返回,在父进程中 返回子进程的id,子进程中返回0;
  2. fork()创建的派生进程(子进程)的内存空间会原样的复制父进程的空间,包括变量值,程序调用栈,环境变量,缓冲区等等。
所以上面的每个进程都会输出2个'-', 关于缓冲区问题,可以参考APUE这本书。

如果你还没有弄懂,好吧!我在费把力气,画个图, 讲述整个过程:

每个分支代表一个进程,共4个;每个节点里面的数据代表到达这一步骤时,这一分支(进程)的缓冲区内 '-'的数量。我们最终把正方形里面的数据加起来就可以得到结果。

现在考虑如下情况:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 
 4 #define N 2
 5 
 6 int
 7 main(void)
 8 {
 9     for (int i = 0; i < N; i++) {
10         fork();
11         printf("-");
12         fflush(stdout);   /* 每次冲刷缓冲区 */
13     }
14     return 0;
15 }

对应的图应该变成这样:

这些图全凭我个人理解而画的,不知对你有没有作用,请原谅我拙劣的画图水平。顺便问一下,大家用什么画图的。


版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Saturn和本文原始地址:
https://ndtm-idea.blogspot.com/2013/07/blog-post.html

0 comments:

Post a Comment