C stdout/stderr消息的约定是什么?
我有一个应用程序,它将帮助和错误消息C stdout/stderr消息的约定是什么?,c,posix,stdout,stderr,printf,C,Posix,Stdout,Stderr,Printf,我有一个应用程序,它将帮助和错误消息fprintf发送到stderr 如果我在退出时状态为“退出”\u SUCCESS(例如,当我向我的应用程序发出“帮助”选项时),我是否应该向stdout发送消息 同样,我是否应该在退出失败时继续向stderr发送错误消息 或者我应该将所有帮助和错误消息发送到stdout 与POSIX兼容的UNIX应用程序的一般约定是什么?通过使用strace,您可以发现许多GNU/Linux实用程序(如ls,date,gcc,make)将其--help输出到stdout。我
fprintf
发送到stderr
如果我在退出时状态为“退出”\u SUCCESS(例如,当我向我的应用程序发出“帮助”选项时),我是否应该向stdout
发送消息
同样,我是否应该在退出失败时继续向stderr发送错误消息
或者我应该将所有帮助和错误消息发送到stdout
与POSIX兼容的UNIX应用程序的一般约定是什么?通过使用
strace
,您可以发现许多GNU/Linux实用程序(如ls
,date
,gcc
,make
)将其--help
输出到stdout。我建议像他们那样做。根据,标准错误用于写入诊断输出。他们似乎让应用程序来定义什么是诊断输出
然而,以我不那么谦虚的看法,我不喜欢在
stderr
上编写帮助文本的应用程序,因为在文本上执行简单的grep
比较困难。我想说的是,哪个程序做这个和哪个不做是50/50。显然错误消息应该转到stderr
,因为在重定向标准输出时,您不想捕获它们
当由于某个命令行选项被无效使用而显示使用情况时,它将显示为错误消息的一部分。因此,它应该转到stderr
并导致EXIT\u故障
当用户通过--help
请求显示用法时,则显示为调用命令的所需行为。因此,它应该转到stdout
,命令应该在EXIT\u SUCCESS
下成功
Posix定义了标准流,其中简要介绍了这一点: 在程序启动时,应预定义三个流,且无需明确打开:标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互设备时,标准输入和标准输出流被完全缓冲 以下内容类似地描述了标准流: 变量:文件*stdout
标准输出流,用于程序的正常输出 变量:文件*stderr
标准错误流,用于程序发出的错误消息和诊断
因此,标准定义对“常规/正常输出”和“诊断/错误输出”之外的流使用几乎没有指导作用。在实践中,通常将这些流中的一个或两个重定向到文件和管道,因此考虑可能的用法。常规输出应该转到
stdout
,尤其是当用户可能grep
或以其他方式分析它时。特别是帮助文本应转到stdout
,以便轻松搜索和分页。有些系统监控代码> STRDER <代码>以输出,并将其视为问题的标志,因此通常只针对实际错误和其他重要的诊断使用它。最后,仅当流实际上是交互式的(例如,如报告的)或由命令行选项显式启用时,才发送交互式输出(如进度指示器)。是的,我同意:帮助文本应转到stdout
。我不喜欢在stdout上打印帮助文本的应用程序,因为如果我想从程序中获取一些东西,而参数是错误的,我仍然可能会被愚弄。如果我将标准错误变灰以查看是否存在错误,我的机制不会发出信号,因为错误调用导致的帮助文本避开了它。如果出于某种原因我真的想grep帮助文本,我只需要使用|&grep.Oops,我想发布这个。我将对此进行清理,使其成为对这个具体问题的更合适的答案。