stderr的奇怪行为

Weird behaviour of stderr

本文关键字:stderr      更新时间:2023-10-16

我的程序中有以下代码

while(1){
  // some code here
 fprintf(stdout,"Output Log");
 fprintf(stderr,"Error Log");

 //some code here
      }

只打印"Error Log"。看起来我在两个脚印之间漏了水。因此,我将"n"附加到字符串"输出日志"。工作得很好。但是我不能理解这个奇怪的行为当我交换两个fprintf

while(1){
  // some code here
 fprintf(stderr,"Error Logn");
 fprintf(stdout,"Output Log");    
 //some code here
      }

尽管使用"n",它只打印"Error log".

你的错误是假设两个消息之间的换行符是导致两个消息同时出现的原因。它实际上是在输出到stdout的末尾的换行符,这导致出现给stdout的消息(给stderr的消息总是可见的,因为stderr没有缓冲)。

在任何情况下,依靠换行符来刷新缓冲区是不可靠的,除非你在stdout上手动设置行缓冲模式;line- buffers仅在stdout为终端时为默认值。如果您不想强制行缓冲或非缓冲模式,那么必须使用fflush来获得输出到stdoutstderr的可靠交错。

stderr是特殊的。它永远不会像stdout那样在应用程序启动时完全缓冲。它取决于是否行缓冲,也可能根本不缓冲(就像这里看起来的那样)。

如果它们连接到相同的输出设备,则没有区别。仔细想想,这是有道理的;您可能希望尽可能快地刷新错误。

似乎stdout是缓冲的,而stderr不是。由于程序永远不会结束,所以缓冲区永远不会刷新。