簡體   English   中英

stderr的怪異行為

[英]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將輸出可靠地交織到stdoutstderr

stderr很特別。 在應用程序啟動時,它永遠不會像stdout那樣被完全緩沖。 它是否行緩沖取決於實現,並且可能根本不緩沖(如此處所示)。

如果將它們拴在同一輸出設備上,則沒有區別。 當您考慮時,這是有道理的; 您可能希望盡快清除錯誤。

似乎stdout已緩沖而stderr沒有。 由於程序永遠不會結束,因此緩沖區永遠不會被刷新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM