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

标准输出流通常是行缓冲的。当您包含\n打印时,您刷新流并在调用5下一个之前将其打印到控制台fork()。当你不包含它时,它只是在某个地方的缓冲区中徘徊,并在fork被调用时与其他所有内容一起被复制。

于 2013-07-19T17:25:47.137 回答
3

printf仅保证在执行 a 时刷新缓冲区\n如果您不这样做,则可以将其他内容写入缓冲区,然后稍后刷新,元素的顺序不同(取决于将元素添加到缓冲区时的顺序) .

于 2013-07-19T17:27:09.817 回答