【问题标题】:Code is Giving unexpected results [duplicate]代码给出了意想不到的结果[重复]
【发布时间】:2013-07-19 02:09:11
【问题描述】:

我只是在试验 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(红帽 4.1.2-48)

提前非常感谢

【问题讨论】:

  • 非常感谢先生...找到原因....抱歉我找不到它这么贴..我以后会注意的

标签: c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-30
      • 2011-03-21
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 2017-01-05
      相关资源
      最近更新 更多