这几天面试,遇到这么一个问题。
请问下面程序输出多少个'-'
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()系统调用的两个特性:
- fork()系统调用会*nix下进程以自身为原本创建的一个派生进程(我们称「子进程」),fork()一次调用,两次返回,在父进程中 返回子进程的id,子进程中返回0;
- fork()创建的派生进程(子进程)的内存空间会原样的复制父进程的空间,包括变量值,程序调用栈,环境变量,缓冲区等等。
如果你还没有弄懂,好吧!我在费把力气,画个图, 讲述整个过程:
每个分支代表一个进程,共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