睡眠和输出冲洗

时间:2011-10-11 22:21:38

标签: c

我在网上的某个地方看到了片段。以下程序不打印“hello-out”。我觉得的原因是因为它实际上是从缓冲区刷新到控制台之前的,

  #include <stdio.h>
  #include <unistd.h>
  int main()
  {
          while(1)
          {
                  fprintf(stdout,"hello-out");
                  fprintf(stderr,"hello-err");
                  sleep(1);
          }
          return 0;
  }

我的理由是否正确?如果不是正确的原因是什么?

2 个答案:

答案 0 :(得分:2)

您应该将\n放在字符串的末尾以使其刷新,或使用fflush将其强制删除。

答案 1 :(得分:1)

以下修复的原因是因为我确实知道默认情况下stdout是行缓冲的,而stderr则不是。

#include <stdio.h>
#include <unistd.h>

int main()
{
    while(1)
    {
        fprintf(stdout,"hello-out");
        fflush(stdout);
        // sleep(1);
        fprintf(stderr,"hello-err");
        sleep(1);
    }
    return 0;
}

更新另一种“修复”它而不更改源代码的方法是使用例如stdbuf

 stdbuf -o 0 ./test

也将标准输出切换到非缓冲模式。有趣的是,如果你指定

 stdbuf -e L ./test

使stderr行缓冲,也不会出现任何输出(直到第一个lineend被打印)