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
来获得输出到stdout
和stderr
的可靠交错。
stderr
是特殊的。它永远不会像stdout
那样在应用程序启动时完全缓冲。它取决于是否行缓冲,也可能根本不缓冲(就像这里看起来的那样)。
如果它们连接到相同的输出设备,则没有区别。仔细想想,这是有道理的;您可能希望尽可能快地刷新错误。
似乎stdout
是缓冲的,而stderr
不是。由于程序永远不会结束,所以缓冲区永远不会刷新。
相关文章:
- 如何将stdout重定向到stderr
- 将 clangd stderr 重定向到文件而不是控制台
- 乱码控制台输出管道 stderr 到更多
- 尝试在 Windows 上重定向 stdout 和 stderr——_fileno(stdout) 返回 -2
- 如何将 stderr 重定向到 /dev/null
- 使用参数 + stdout + stderr 从命令行调用 MFC 应用程序
- visual Redirect stdout/stderr to null vs2017 c++
- 如何将"cout"、"cerr"、"stdout"和"stderr"从C++程序定向到单个文件
- 如何在没有任何缓冲区的情况下将 stderr 重定向到文件?
- 如何重定向 stderr 并使用 popen() 在后台运行
- stdin,stdout,stderr是如何关闭的
- 如何分离以C++执行的 Java 应用程序的 stdin/stout/stderr 流
- 在Qt中:我可以输出到“stdout”吗,就像使用qDebug()输出到“stderr”一样简单
- 为什么在Shell输出中运行的可执行操作到stdout,而不是崩溃时的stderr
- 从C 中的Python程序中检索stderr
- 当STDERR重定向到管道时,为什么BOOST ::流程在Windows上崩溃
- C++-将stdout/stderr复制到文件,同时保留控制台输出
- 使用std :: freopen重定向stderr c
- 重定向PostgreSQL Qt驱动程序stdout/stderr输出
- 在sigpipe之后恢复stdout和stderr