从 printf 打印自定义错误消息时为什么要使用 stderr 可以正常工作?
例如,当我可以写这样的语句时,为什么还要使用 stderr:
printf("错误!你没有……等等等等");
stderr
代表标准错误流。
在控制台编程中,它就是控制台——屏幕。它本质上与stdout
.
一般的做法是将所有错误消息stderr
和所有常规输出重定向到stdout
.
原因是可以将标准输出重定向到文件而不是屏幕。因此,如果您dir > dirlist.txt
在命令提示符下执行命令,目录列表将进入文本文件而不是屏幕。如果您编写代码将错误消息重定向到stderr
,则错误将始终显示在屏幕上而不是文件上,以便用户可以立即收到警告,而不是最终在文件中看到意外结果。
usingprintf()
将向控制台显示错误消息,该消息将存储在stdout
缓冲区中,但 usingstderr
则不同
stderr
可以用作任何接受 FILE* 类型参数并期望输出流的函数的参数,例如fputs
or fprintf
。
尽管在许多情况下两者stdout
和stderr
都与相同的输出设备(如控制台)相关联,但应用程序可能会区分发送到 stdout 的内容和发送到 stderr 的内容,以防其中一个被重定向。例如,经常将控制台程序 ( stdout
) 的常规输出重定向到文件,同时期望错误消息继续出现在控制台中。
freopen
也可以使用该函数从程序中将 stderr 重定向到其他目的地。
stderr
is 永远不会在启动时完全缓冲。默认情况下,流是行缓冲还是不缓冲取决于库(参见 setvbuf)。
将所有错误消息重定向到 是一种很好的做法stderr
,同时将常规输出定向到stdout
. 这样做是有益的,因为写入的任何内容stderr
都不会被缓冲,即,它会立即写入屏幕,以便可以立即警告用户。
这是一个很好的做法。
假设您使用linux。如果是这样,您可以按照以下方式运行程序:
./program >out 2>错误
'out' 文件将仅包含 STDOUT。
“错误”文件将仅包含 STDERR
因此,如果您的输出有数百行长,则在“错误”中查找少量错误比查看大量非错误行和错误行更容易。
如果您将程序的输出重定向到文件中,您仍然希望在屏幕上看到错误。
除了stderr
不被缓冲之外,将输出拆分为错误与正常输出也很好,以允许其他程序更轻松地使用您的程序。这样,调用程序可以根据需要知道的内容有选择地重定向标准或错误输出。可以通过 Unix shell 手动使用相同的工具 - 这是我有时使用的一种方式:
% find / -iname hello.txt
find: /.DocumentRevisions-V100: Permission denied
find: /.fseventsd: Permission denied
find: /.MobileBackups: Permission denied
find: /.Spotlight-V100: Permission denied
find: /.Trashes: Permission denied
^C
% find / -iname hello.txt 2>/dev/null <-- filter "Permission denied" errors