分享腾讯笔试中的一道题,是关于fork()的。
#include<stdio.h>
#include <unistd.h>
#include <system/types.h>
void main()
{
int i=0;
for(i=0; i<2;i++)
{
fork();
printf("K");
}
}
问你一共打印出几个K。
如果了解fork()工作机制的人会很快答出6个K,P1产生了P2和P3两个进程,P2产生了P4进程,P1,P2打印两次(i=0.i=1),P3P4打印一次(i=1),一共6次。但是答案却不是这样的,应该是8次。为什么会是8次呢,这是由于printf函数的缓冲机制。printf只是把值存入到缓冲区,等遇到回车符时进行刷新输出。fork()会把父进程的代码数据还有内存都拷贝一份的,包括这个缓冲区。因此, 第一次循环时缓冲区为空,P1,P2在i=0时输出一个K。当P1fork()产生P3时,缓冲区中已经有了一个K,所以P3打印时打印了两个K,同理P4也打印了两个K。最后得出答案:8个K。