在C语言中,stdout并stderr都打印到系统默认的控制台窗口。有什么区别stderr和stdout其他比缓冲的水平?
stdout和之间的区别之一stderr是缓冲级别。在§7.21.3 Files ¶7 中,C11 标准说:
在程序启动时,三个文本流是预定义的,不需要显式打开——标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。最初打开时,标准错误流没有完全缓冲;当且仅当可以确定流不是指交互设备时,标准输入和标准输出流才被完全缓冲。
通常,这意味着标准输出是行缓冲的(因此在打印换行符或缓冲区已满时刷新数据),而标准错误是行缓冲或未缓冲的。当然,这些特征是可以改变的。
标准错误流的目的是将错误消息与常规输出分开。这在诸如 shell 脚本之类的上下文中很重要,其中标准输出可能被发送到管道或文件。该重定向使标准错误仍然转到不同的地方——通常是终端。您也可以将标准输出与标准错误分开捕获,至少在 shell 足够强大的情况下。
program > file
program | filter
program 2> error.log | filter
program > file 2> error.log
program 2> error.log
Run Code Online (Sandbox Code Playgroud)
前两个使错误消息在终端上可见。最后三个捕获文件中的错误消息error.log——分别将标准输出发送到filter程序、file或发送到终端窗口。
通过将错误消息与标准输出分开,管道中的程序(filter在我的示例中)不必解释来自 的错误消息program,这使它们变得更加简单。