C中的stdout和stderr有什么区别?

What is the difference between stdout and stderr in C?

在 C 中,stdoutstderr 默认都打印到控制台 window。 stderrstdout 除了缓冲级别之外还有什么区别吗?

stderr 是错误的地方。这真的很有用。像 make - 如果程序的 return 代码不是 0(它完成但有错误),它将打印 stderrstderrstdout 用户无法区分,但仍然是推荐的错误位置。但是,如果您的程序将被任何自动化程序运行、shell 脚本等...它可以用来跟踪错误,并且总是 使用它。

如果 运行 来自控制台、批处理文件或快捷方式的程序,请使用 > 或 1> 将 stdout 重定向到文件,并使用 2> 将 stderr 重定向到文件.例如,如果从 stdin 读取,并同时写入 stdout 和 stderr:

myprog <input.txt >output.txt 2>error.txt

或者如果你想将 stdout 输出到文件,但 stderr 显示在屏幕上,请使用:

myprog <input.txt >output.txt

stdoutstderr 之间的区别之一是缓冲级别。在 §7.21.3 Files ¶7 中,C11 标准说:

At program startup, three text streams are predefined and need not be opened explicitly -- standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). As initially opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device.

通常,这意味着标准输出是行缓冲的(因此在打印换行符或缓冲区已满时刷新数据),而标准错误是行缓冲或未缓冲的。当然,这些特征是可以改变的。

标准错误流的目的是将错误消息与常规输出分开。这在诸如 shell 脚本的上下文中很重要,其中标准输出可能被发送到管道或文件。该重定向使标准错误仍会转到不同的位置——通常是终端。您也可以将标准输出与标准错误分开捕获,至少如果 shell 足够强大。

 program > file
 program | filter
 program 2> error.log | filter
 program > file 2> error.log
 program 2> error.log

前两个在终端上留下可见的错误消息。最后三个捕获文件 error.log 中的错误消息 — 将标准输出分别发送到 filter 程序、file 或终端 window。

通过将错误消息与标准输出分开,管道中的程序(在我的示例中为 filter)不必解释来自 program 的错误消息,简单多了。