0

fork() c++ 関数を試しているところですが、驚くべき結果が見つかりました

#include<stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
int main()
{
 int x=0;
  int i;
  for( i=0;i<2;i++)
  {
    fork();
    x=x+5;
    printf("%d\n",x);
   sleep(2);
  }
  return 0;
}

このコードは期待どおりの出力を提供しています 5

5

10

10

10

10

しかし、printf の改行をスペースに置き換えると、同じコードの動作が大きく異なります。

int main()
{
 int x=0;
  int i;
  for( i=0;i<2;i++)
  {
    fork();
    x=x+5;
    printf("%d  ",x);
   sleep(2);
  }
  return 0;
}

5 10 5 10 5 10 5 10

新しい行をスペースに置き換えたときになぜ異常な結果が得られたのか、誰にもわかりますか。

gcc コンパイラ gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-48) を使用しています

事前にどうもありがとう

4

2 に答える 2

4

標準出力ストリームは通常、行バッファリングされます。when 印刷を含める\nと、ストリームがフラッシュされ、次が呼び出される5前にコンソールに出力されます。fork()含めない場合は、どこかのバッファにぶら下がっているだけで、forkが呼び出されたときに他のすべてのものと一緒に複製されます。

于 2013-07-19T17:25:47.137 に答える
3

printfを実行した場合にのみバッファをフラッシュすることが保証され\nます.1つを実行しないと、他のものがバッファに書き込まれ、後で要素が異なる順序でフラッシュされます(バッファに追加されたときの順序によって異なります)。 .

于 2013-07-19T17:27:09.817 に答える