2011-06-21 35 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 
         ^^^^