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

C中的stdout和stderr有什么区别?,c,stderr,C,Stderr,在C中,默认情况下,stdout和stderr都会打印到控制台窗口。除了缓冲级别之外,stderr和stdout之间有什么区别吗?stderr是错误的地方。它真的很有用。像make-如果程序的返回码不是0(它完成时有错误),它将打印stderrstderr不能由用户区分为stdout,但它仍然是建议出错的地方。但是,如果您的程序将由任何自动化程序、shell脚本等运行。。。它可用于跟踪错误,并始终使用它。如果从控制台、批处理文件或快捷方式运行程序,请使用>或1>将标准输出重定向到文件,使用2>将

在C中,默认情况下,
stdout
stderr
都会打印到控制台窗口。除了缓冲级别之外,
stderr
stdout
之间有什么区别吗?

stderr
是错误的地方。它真的很有用。像
make
-如果程序的返回码不是0(它完成时有错误),它将打印
stderr
stderr
不能由用户区分为
stdout
,但它仍然是建议出错的地方。但是,如果您的程序将由任何自动化程序、shell脚本等运行。。。它可用于跟踪错误,并始终使用它。

如果从控制台、批处理文件或快捷方式运行程序,请使用>或1>将标准输出重定向到文件,使用2>将标准输出重定向到文件。例如,如果从stdin读取数据,同时向stdout和stderr写入数据:

myprog <input.txt >output.txt 2>error.txt
myprog output.txt 2>error.txt
或者,如果您希望标准输出为文件,但要在屏幕上显示标准输出,请使用:

myprog <input.txt >output.txt
myprog output.txt

stdout
stderr
之间的区别之一是缓冲级别。在中,C11标准规定:

在程序启动时,三个文本流是预定义的,不需要显式打开——标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。初始打开时,标准错误流没有完全缓冲;当且仅当可以确定流不引用交互设备时,标准输入和标准输出流被完全缓冲

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

标准错误流的目的是将错误消息与常规输出分开。这在诸如shell脚本之类的上下文中很重要,在这些上下文中,标准输出可能被发送到管道或文件。这种重定向使得标准错误仍然会转移到另一个地方——通常是终端。您还可以单独捕获标准输出和标准错误,至少在shell功能足够强大的情况下是这样

 program > file
 program | filter
 program 2> error.log | filter
 program > file 2> error.log
 program 2> error.log
前两种方法使错误消息在终端上可见。最后三个捕获文件
error.log
中的错误消息-将标准输出分别发送到
过滤器
程序、
文件
或终端窗口


通过将错误消息与标准输出分离,流水线下的程序(在我的示例中为
filter
)不必解释
program
中的错误消息,这使它们变得非常简单。

但现在这是错误的,或者至少是不清楚的:“stderr不能与stdout区分开来”。两者当然可以区分。这是写stdout vs sterr的要点。“错误的地方”低估了这一点:stderr是诊断输出的地方。有些东西是诊断输出,但不是错误,比如日志消息;这些也属于stderr,除非您的程序的目的是检索日志消息(这将使它们输出)。类似地,shell提示被打印到stderr:它们是诊断性的,只要(1)没有输出,(2)存在以提供程序状态的带外状态(f/e,是否准备好进行新的输入)。