在c中使用fork时的缓冲机制

时间:2012-07-05 14:12:31

标签: c file-io

  

可能重复:
  Working of fork() in linux gcc
  Why does this code print two times?

我想知道以下代码输出背后的原因:

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

int main()
{
   FILE *fp;
   int n;
   printf("%d",45);
   //fflush(stdout);
   if((n=fork())>0){
      printf("in parent\n");  
      exit(0);
   }
   else if(n==0)
       printf("%d",45);
}

输出

45inparent
4545

如果我使用fflush,则输出

45inparent
45

另外,我正在linux平台上运行

2 个答案:

答案 0 :(得分:2)

第一个printf()将字符串45写入内存缓冲区。

在fork()调用期间,缓冲区在子进程中实际上是重复的,因此父进程和子进程在stdout的缓冲区中都有45

在两个进程中刷新缓冲区将写入45两次。

答案 1 :(得分:2)

子进程继承了打开的文件描述符(在本例中为stdout)和与之关联的缓冲区。

  • 如果你没有在fork之前刷新缓冲区,那么缓冲区的内容将被复制(包括“45”),并且“45”将被打印两次。
  • 如果在fork之前刷新,则清空缓冲区并且子级获取缓冲区的空副本,因此父级只打印一次“45”。