2
#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
4

2 回答 2

4

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

如果你 fork 程序,缓冲区不会被刷新。

于 2013-02-17T15:48:51.347 回答
3

printf不一定stdout立即刷新,所以会发生“abcd”被缓冲直到执行下一个输出。由于稍后 fork 的两个“边”都进行了输出,因此两者也将清除“abcd”。

要使其按照您可能猜测的方式工作,请尝试手动冲洗;

int main()
{

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

$ ./a.out 
abcdpqrs
pqrs
于 2013-02-17T15:50:06.010 回答