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

的上面的输出我的机器上是代码睡在while循环期望输出

hello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-err 

我不得不杀程序停止它。 这是正确和预期的行为。 或者这是错误的。这是一个面试问题,因此我在这里发布。

+7

你问的问题。你的问号键是否被打破。 –

+0

我在那里看到一个问题,它没有问号。但是如果你愿意,你也可以识别它。 – Skurmedel

+0

10K用户可以看到一个相同的问题[这里](http://stackoverflow.com/questions/6283556/buffering-for-stdout-stderr-streams),它由于某种原因被删除。一个耻辱,因为它有很好的答案。 – interjay

回答

8

这是预期的输出:

  • 程序循环永远,因为while (1)循环。
  • stdout是行缓冲的(默认情况下),因此只有在打印换行符('\n')时才会刷新到控制台。由于您不打印任何换行符,因此您从未看到任何hello-out文字。
  • stderr不是行缓存的(默认情况下),所以它会在每次调用新的fprintf()时更新控制台。
+0

我用'usleep(9000)'替换了'sleep(1)'。并做了'./a.out 2>/dev/null'。我看到了hello-out被打印出来。这是一个操作系统相关的问题,当缓冲区充满它'刷新'它? [在Ideone上](http://www.ideone.com/cUExK)。编辑:塞思的回答提到它。 –

5

stdout在大多数机器上都有缓冲。除非您打印换行符或致电fflush(),否则您不会看到任何fprintf呼叫的输出到stdout

所以是的,这是预期的行为,大部分时间。

4

虽然每个人都是正确的,你有一个无限循环,stderr没有缓冲,所以你立即得到它,stdout是行缓冲,所以它被推迟,直到你得到一个换行符,他们没有提到stdout没有无限存储。我认为默认情况下缓冲区大概是1k左右(请参阅setbuf)。如果你等待足够长的时间,你会得到很长时间的hello-out序列。完全可能的是,最后一个hello-out可能会被截断为字符串“hello-out”的一部分。

[...]hello-outhello-outhellhello-errhello-err 
         ^^^^