#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
我机器上面的输出是
hello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-err
我不得不杀死程序来阻止它。 这是正确和预期的行为。 或者这是错误的。这是一个面试问题,因此我在这里发帖。
答案 0 :(得分:8)
这是预期的输出:
while (1)
循环,程序会永远循环。stdout
是行缓冲的(默认情况下),因此只有在打印换行符('\n'
)时才会刷新到控制台。由于您不打印任何换行符,因此您永远不会看到任何hello-out
文字。stderr
不是行缓冲(默认情况下),因此它会在每次新的fprintf()
调用时更新控制台。答案 1 :(得分:5)
stdout
在大多数机器上都是缓冲的。除非您打印换行符或致电fprintf
,否则您不会看到stdout
来电fflush()
来电的任何输出。
所以是的,这是预期的行为,大部分时间都是。
答案 2 :(得分:4)
虽然每个人都是正确的,你有一个无限循环,stderr没有缓冲,所以你立即得到它,stdout是行缓冲的,所以它被推迟到你得到换行符,他们没有提到stdout没有无限存储。我认为默认情况下缓冲区大约是1k(参见setbuf)。如果你等待足够长的时间,你会得到很长时间的问候。完全可能的是,最后一个问候语可能会被截断到字符串“hello-out”的一部分。
[...]hello-outhello-outhellhello-errhello-err
^^^^