3

可能重复:
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);
}

输出

45inparent
4545

如果我使用 fflush,那么输出

45inparent
45

另外,我在linux平台上运行

4

2 回答 2

4

子进程继承打开的文件描述符(在这种情况下为标准输出)和与之关联的缓冲区。

  • 如果在 fork 之前不刷新缓冲区,那么缓冲区的内容就会重复(包括“45”),并且会打印两次“45”。
  • 如果在 fork 之前刷新,则缓冲区被清空,并且子进程获得缓冲区的空副本,因此父进程仅打印一次“45”。
于 2012-07-05T14:25:55.147 回答
2

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

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

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

于 2012-07-05T14:17:36.027 回答