3

重複の可能性:
Linux gccでのfork()の
動作なぜこのコードは2回出力されるのですか?

以下のコードの出力の背後にある理由を知りたいです:

#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

子プロセスは、開いているファイル記述子 (この場合は stdout) とそれに関連付けられているバッファーを継承します。

  • フォークの前にバッファーをフラッシュしないと、バッファーの内容が複製され ("45" を含む)、"45" が 2 回出力されます。
  • フォークの前にフラッシュすると、バッファーが空になり、子はバッファーの空のコピーを取得するため、親によって「45」が一度だけ出力されます。
于 2012-07-05T14:25:55.147 に答える
2

最初の printf() は、文字列45をメモリ バッファに書き込みます。

fork() 呼び出しの間、バッファーは子プロセスで仮想的に複製されるため、親と子の両方が45stdout のバッファーにあります。

両方のプロセスでそのバッファをフラッシュすると、452 回書き込まれます。

于 2012-07-05T14:17:36.027 に答える