c中使用fork时的缓冲机制

Dha*_*tri 4 c file-io

可能的重复:
Linux gcc 中 fork() 的工作
为什么此代码打印两次?

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

输出

45inparent
4545
Run Code Online (Sandbox Code Playgroud)

如果我使用 fflush,那么输出

45inparent
45
Run Code Online (Sandbox Code Playgroud)

另外,我是在linux平台上运行的

Sdr*_*dra 5

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

  • 如果在 fork 之前没有刷新缓冲区,则缓冲区的内容会重复(包括“45”),并且“45”会被打印两次。
  • 如果在 fork 之前刷新,缓冲区将被清空,并且子进程将获得缓冲区的空副本,因此“45”仅由父进程打印一次。