代码正在给出意想不到的结果

时间:2013-07-19 17:23:46

标签: c

我只是在尝试使用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

但是当我用prints替换带有空格

的新行时,相同的代码行为非常不同
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)

提前多多感谢

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

printf只保证在执行\n时刷新缓冲区如果你不做,那么可以将其他东西写入缓冲区,然后在以后刷新元素不同的顺序(取决于它被添加到缓冲区时)。