Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C stdout/stderr消息的约定是什么?_C_Posix_Stdout_Stderr_Printf - Fatal编程技术网

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,我想发布这个。我将对此进行清理,使其成为对这个具体问题的更合适的答案。