[英]Weird behaviour of stderr
我的程序中有此代碼
while(1){
// some code here
fprintf(stdout,"Output Log");
fprintf(stderr,"Error Log");
//some code here
}
它僅打印“錯誤日志”。 看起來我好像缺少兩個fprintf之間的刷新。 因此,我將“ \\ n”附加到字符串“輸出日志”。 很好 但是當我只交換兩個fprintf時,無法理解這種奇怪的行為
while(1){
// some code here
fprintf(stderr,"Error Log\n");
fprintf(stdout,"Output Log");
//some code here
}
盡管使用“ \\ n”,它僅顯示“錯誤日志”。
您的錯誤是假設兩條消息之間的換行符是導致兩者均出現的原因。 實際上,這是stdout
輸出末尾的換行符,導致消息顯示為stdout
(發送給stderr
的消息始終可見,因為stderr
是未緩沖的)。
無論如何,除非您在stdout
上手動設置行緩沖模式,否則依靠換行符刷新緩沖區是不可靠的。 僅當stdout
為終端時,行緩沖才是默認設置。 如果您不想強制使用行緩沖或非緩沖模式,則必須使用fflush
將輸出可靠地交織到stdout
和stderr
。
stderr
很特別。 在應用程序啟動時,它永遠不會像stdout
那樣被完全緩沖。 它是否行緩沖取決於實現,並且可能根本不緩沖(如此處所示)。
如果將它們拴在同一輸出設備上,則沒有區別。 當您考慮時,這是有道理的; 您可能希望盡快清除錯誤。
似乎stdout
已緩沖而stderr
沒有。 由於程序永遠不會結束,因此緩沖區永遠不會被刷新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.