【问题标题】:Weird behaviour of stderrstderr 的奇怪行为
【发布时间】:2013-02-28 07:04:55
【问题描述】:

我的程序中有这段代码

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”,但它只打印“错误日志”。

【问题讨论】:

    标签: c++ c stdout stderr


    【解决方案1】:

    您的错误是假设两条消息“之间”的换行符是导致两者出现的原因。实际上,stdout 的输出的换行符末尾 导致出现stdout 的消息(stderr 的消息始终可见,因为stderr 没有缓冲)。

    在任何情况下,依靠换行符刷新缓冲区是不可靠的,除非您在stdout 上手动设置行缓冲模式;仅当 stdout 是终端时,line-buffered 才是默认设置。如果您不想强制使用行缓冲或非缓冲模式,则必须使用fflush 以可靠地将输出交错到stdoutstderr

    【讨论】:

      【解决方案2】:

      stderr 很特别。它永远不会像stdout 那样在应用程序启动时完全缓冲。它是否是行缓冲的取决于实现,并且它可能根本没有缓冲(如此处所示)。

      如果它们被连接到同一个输出设备上没有区别。仔细想想,这是有道理的。您可能希望以合理的速度尽快清除错误。

      【讨论】:

        【解决方案3】:

        似乎stdout 被缓冲而stderr 没有。由于程序永远不会结束,缓冲区永远不会被刷新。

        【讨论】:

          猜你喜欢
          • 2014-03-12
          • 2011-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-08
          • 2015-07-20
          • 2010-10-03
          • 2021-07-12
          相关资源
          最近更新 更多