我有一个应该在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
输出都会按预期显示。
这里发生了什么?
答案 0 :(得分:1)
这段代码是正确的(好吧,void *从work()返回是不好的形式 - void会好得多。)
我怀疑这个问题只是你没有等待足够长的时间 - 需要花费一些时间来迭代100,000,000次迭代,特别是每次循环都要输出(记住 - 一旦你填满了输出,你就会阻塞输出stdout buffer)。
我估计在将第二个输出输出到标准输出之前至少需要3分钟。