您的位置:首页 > 运维架构 > Linux

某公司笔试题——Linux fork()

2016-04-04 12:17 267 查看
直接来源代码:

#include <stdio.h>
#include <unistd.h>
#include <wait.h>

int main()
{
for (int i = 0; i < 2; ++i)
{
fork();
printf("K");
}
wait(NULL);
return 0;
}
请问会输出多少个K?

进程关系如下图:



图.1 进程关系示意图
由上图,一看可以看到输出结果是6.
可是,少年,Too young,too simple啊。
fork一个进程会发生什么事?大多数人都知道会复制程序调用栈,环境变量等等,程序代码段当然不会复制了。
但是,遗漏了一个重要的东西,那就是缓冲区,缓冲区在fork的时候也要被复制一份!!!
那知道会发生什么了吧,上面程序是调用c标准输出函数输出k,也就是printf,而标准输出是基于行缓冲的;第一次调用fork的时候,父子进程的K并没有输出,而是在缓冲区里面。
如果是:

...
printf("K\n");
...
或者:

...
write(STDOUT_FILENO, "K", 1);
...
那么缓冲区就将被刷新,此时就是输出6个K.

因为输出缓冲区没被刷新,所以程序执行就像这样:



图.2 程序fork输出示意图

所以,针对这条题目,是输出8个K。

最后,感谢,学习了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: