C中的stdout和stderr有什么区别?
What is the difference between stdout and stderr in C?
在 C 中,stdout
和 stderr
默认都打印到控制台 window。 stderr
和 stdout
除了缓冲级别之外还有什么区别吗?
stderr
是错误的地方。这真的很有用。像 make
- 如果程序的 return 代码不是 0(它完成但有错误),它将打印 stderr
。 stderr
和 stdout
用户无法区分,但仍然是推荐的错误位置。但是,如果您的程序将被任何自动化程序运行、shell 脚本等...它可以用来跟踪错误,并且总是 使用它。
如果 运行 来自控制台、批处理文件或快捷方式的程序,请使用 > 或 1> 将 stdout 重定向到文件,并使用 2> 将 stderr 重定向到文件.例如,如果从 stdin 读取,并同时写入 stdout 和 stderr:
myprog <input.txt >output.txt 2>error.txt
或者如果你想将 stdout 输出到文件,但 stderr 显示在屏幕上,请使用:
myprog <input.txt >output.txt
stdout
和 stderr
之间的区别之一是缓冲级别。在 §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
的错误消息,简单多了。
在 C 中,stdout
和 stderr
默认都打印到控制台 window。 stderr
和 stdout
除了缓冲级别之外还有什么区别吗?
stderr
是错误的地方。这真的很有用。像 make
- 如果程序的 return 代码不是 0(它完成但有错误),它将打印 stderr
。 stderr
和 stdout
用户无法区分,但仍然是推荐的错误位置。但是,如果您的程序将被任何自动化程序运行、shell 脚本等...它可以用来跟踪错误,并且总是 使用它。
如果 运行 来自控制台、批处理文件或快捷方式的程序,请使用 > 或 1> 将 stdout 重定向到文件,并使用 2> 将 stderr 重定向到文件.例如,如果从 stdin 读取,并同时写入 stdout 和 stderr:
myprog <input.txt >output.txt 2>error.txt
或者如果你想将 stdout 输出到文件,但 stderr 显示在屏幕上,请使用:
myprog <input.txt >output.txt
stdout
和 stderr
之间的区别之一是缓冲级别。在 §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
的错误消息,简单多了。