【问题标题】:sleep() delays output until end [duplicate]sleep() 延迟输出直到结束
【发布时间】:2011-05-11 04:58:51
【问题描述】:

可能重复:
Why does printf not flush after the call unless a newline is in the format string? (in C)

我在 C 中使用 sleep() 函数,但遇到了一个问题:我不确定这是不是问题,所以我将整个代码归结为:

int main() {

  printf("1");
  sleep(3);
  printf("2");

  return 0;
}

我认为这应该产生的是 1 .. 等待 3 秒 .. 2. 相反,程序等待 3 秒然后打印 12。有什么方法可以使用睡眠功能,以便我得到第一个输出?

谢谢

【问题讨论】:

  • 正如我在下面提到的,我不知道这是问题的原因。

标签: c sleep


【解决方案1】:

实际上延迟输出的不是睡眠功能,而是标准输出流的缓冲特性。 2 的输出几乎肯定也延迟到您的程序退出 main,但延迟很小,您没有注意到它。

如果可以检测到标准输出是指交互式设备,则标准输出是行缓冲的(否则它是完全缓冲的)。

如果您在每次想要立即查看的输出调用之后fflush (stdout),那将解决问题。

或者,您可以在操作stdout 之前使用setvbuf,将其设置为无缓冲,您不必担心将所有这些fflush 行添加到您的代码中:

setvbuf (stdout, NULL, _IONBF, BUFSIZ);

请记住,如果您将输出发送到文件,可能会对性能产生相当大的影响。另请记住,对此的支持是实现定义的,标准不保证。

ISO C99 部分 7.19.3/3 是相关位:

当流无缓冲时,字符会尽快从源或目标出现。否则,字符可能会作为一个块累积并传输到主机环境或从主机环境传输。

当一个流完全缓冲时,当缓冲区被填满时,字符将作为一个块传输到主机环境或从主机环境传输。

当流被行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。

此外,当缓冲区被填满、在非缓冲流上请求输入时,或者在需要从宿主环境。

对这些特性的支持是实现定义的,可能会受到setbufsetvbuf 函数的影响。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 如果您可以简单地通过链接到另一个问题来回答,那就是重复问题 - 您应该发表评论让我们知道这一点,以便我们将其作为重复问题关闭。
    • 我不知道这是它背后的问题,我认为这是由 sleep() 函数中的某些东西引起的,但我会自己添加评论。
    【解决方案3】:

    标准库缓冲输出,等到有足够的输出来分摊实际打印的成本。

    您必须在每次打印后刷新缓冲区,以确保在代码继续之前将其打印出来:

    fflush(stdout);
    

    【讨论】:

    • 不是操作系统在做缓冲,而是标准库。
    【解决方案4】:

    试试:

    int main() {
    
      printf("1");  fflush(stdout);
      sleep(3);
      printf("2");  fflush(stdout);
    
      return 0;
    }
    

    强制 io 库在 sleep 和 return 语句之前清空它的缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2021-11-09
      • 2020-04-07
      • 2016-08-05
      • 1970-01-01
      相关资源
      最近更新 更多