将输出流式传输到stdout,将就地状态更新到stderr

时间:2018-05-11 00:20:45

标签: c printf stdio

我有一个应该在stdout上生成输出的程序,以及stderr上的瞬态状态信息。具有类似结果的程序可能包括rsync或apt(尽管它们的输出足够复杂,可以将它减少到我需要的基本要求)。

这个程序似乎就像它应该按照描述的那样工作,但不是:

#include <stdio.h>
#include <limits.h>

void *work () {
  for (long i = 0; i < LONG_MAX; i++) {
    if (i % 100000000 == 0) {
      fprintf(stdout, "%ld\n", i);
    }
    fprintf(stderr, "\rrunning %ld", i);
  }

  return 0;
}

int main() {
  work(0);
  fprintf(stderr, "\ndone\n");
  return 0;
}

状态信息会根据需要通过stderr进行更新,但stdout只显示一行输出。如果移除stderr状态fprintf,则所有stdout输出都会按预期显示。

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

这段代码是正确的(好吧,void *从work()返回是不好的形式 - void会好得多。)

我怀疑这个问题只是你没有等待足够长的时间 - 需要花费一些时间来迭代100,000,000次迭代,特别是每次循环都要输出(记住 - 一旦你填满了输出,你就会阻塞输出stdout buffer)。

我估计在将第二个输出输出到标准输出之前至少需要3分钟。