2011-10-11 65 views
1

我在網上的某個地方看到了代碼片段。以下程序不打印「hello-out」。究其原因,我覺得是因爲之前它實際上是刷新到緩衝區中的控制檯,睡眠和輸出齊平

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

是我的原因是否正確?如果不是什麼正確的原因?

+0

這可能是因爲'stdout'被重定向到一個文件或其他地方,而'stderr'正在去控制檯。 – AJG85

回答

2

您應該在字符串末尾放置\n以使其刷新,或者使用fflush將其強制排除。

1

原因如下修復是因爲我知道默認情況下stdout是行緩衝,而stderr不是。

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    while(1) 
    { 
     fprintf(stdout,"hello-out"); 
     fflush(stdout); 
     // sleep(1); 
     fprintf(stderr,"hello-err"); 
     sleep(1); 
    } 
    return 0; 
} 

更新另一種方式來「修復」它不改變的源代碼是通過使用例如stdbuf

stdbuf -o 0 ./test 

它將標準輸出切換到非緩衝模式。有趣的是,如果指定

stdbuf -e L ./test 

,使標準錯誤linebuffered爲好,沒有輸出將出現在所有(直到第一lineend獲取打印)

+1

有趣的是,我不知道'stdbuf'命令,儘管它似乎是一個非標準的glibc擴展。 –