这个fork()程序的输出

时间:2013-02-17 15:46:30

标签: c process fork

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
int main()
{
   printf("abcd");
   fork ();
   printf("pqrs\n");
   return 0;
}

该程序输出如下:

abcdpqrs
abcdpqrs

但怎么可能呢?不应该是:

abcdpqrs
pqrs

2 个答案:

答案 0 :(得分:4)

这是因为fork还复制了printf中使用的数据结构,保存了要打印的缓冲区。

如果您分叉程序,则不刷新缓冲区。

答案 1 :(得分:3)

printf不一定立即刷新stdout,所以会发生“abcd”被缓冲直到执行下一个输出。因为后来fork的两个“side”都输出,所以两者都会清除“abcd”。

为了让它按照您猜测它的方式工作,请尝试手动刷新;

int main()
{

   printf("abcd");
   fflush(stdout);
   fork ();
   printf("pqrs\n");
   return 0;
}

$ ./a.out 
abcdpqrs
pqrs