【发布时间】:2018-10-21 08:02:12
【问题描述】:
我有一个程序应该在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 输出都会按预期显示。
这是怎么回事?
【问题讨论】:
-
每次打印后尝试 fflush(stdout) 和 fflush(stderr)。
-
那无济于事。 stdout默认是行缓冲的,输出到stdout后面有换行符,stderr默认是无缓冲的。