繁体   English   中英

关于STDIN,STDOUT,STDERR和返回值

[英]About STDIN,STDOUT,STDERR and return value

我可以通过对STDINSTDOUTSTDERR使用< >2>来重定向数据流。

不知何故,我把它们与返回值混淆了。

如果返回值为12如何理解?

如果返回值为-1怎么理解?

break可以退出循环,但继续执行以下代码, return怎么样? 一旦看到return ,它将用返回码终止main() ,对吗?

为了回答这个问题,让我们参考C99标准。 如果您阅读7.20.4.3退出函数 ,则会发现以下语句:

5最后,控制权返回到主机环境。 如果status的值为零或EXIT_SUCCESS ,则返回实现定义的状态成功终止的形式。 如果status值为EXIT_FAILURE ,则返回实现定义的状态,表示状态失败终止。 否则,返回的状态是实现定义的。

这里应该强调的是,C标准没有为退出状态指定任何特定的代码。 在上面的代码段中,您可以看到提到的 ,但这纯粹是exit() API的一部分。 改写句子的其余部分,可以将映射到任何其他由实现定义的成功终止上。 同样,不能保证EXIT_SUCCESSEXIT_FAILURE的定义不会映射到其他代码上。 特别是,它甚至可能不会以整数结尾。

此外,如果您查看7.20.4.6系统功能 ,则会注意到:

返回3如果参数为空指针,则仅当命令处理器可用时,系统函数才返回非零。 如果参数不是空指针,并且系统函数确实返回,则它返回实现定义的值。

这确认了退出代码纯粹是实现定义的,并且您不能依赖任何特定的行为。


现在, POSIX对此进行了扩展。 如果您阅读stdlib.h标头,则会发现:

EXIT_FAILURE

exit()的终止失败; 计算为非零值。

EXIT_SUCCESS

成功终止exit(); 评估为0。

这已经将实现限制为成功退出使用0 但是,它并没有真正定义哪个非零值用于失败。

如果您阅读exit()函数,则会发现:

状态值可以是0,EXIT_SUCCESS,EXIT_FAILURE或任何其他值,尽管只有最低有效的8位(即状态&0377)可供等待的父进程使用。

通过确保将0…255范围内的退出状态提供给其他进程,这也扩展了C的定义。

因此,POSIX将零定义为成功退出,将EXIT_FAILURE (一些非零值)定义为不成功退出,并将其余值留给程序使用。

但是,如果要从其他进程解析终止代码,则还应该查看wait()函数。 它定义了用于处理非正常终止状态(如信号终止)的返回状态的其他宏。


如果我们走得更远,我们会发现FreeBSD引入了sysexits.h标头来进一步定义退出代码。

成功退出始终由状态0或EX_OK指示。 错误号从EX__BASE开始,以减少与随机程序可能已经返回的其他退出状态发生冲突的可能性。 这些代码的含义大致如下:

EX_USAGE(64)命令使用不正确,例如,参数数量错误,标志错误,参数语法错误等。 […]

这意味着为FreeBSD编写的应用程序可以使用定义良好的退出代码64+。


总结一下:

  1. C标准仅定义用于返回成功不成功退出的API。 它没有定义如何使用,传递或获得该结果。
  2. POSIX严格要求成功使用 ,并保证在正常进程终止的情况下,退出代码的8个最低有效位将可用于其他进程(例如,通过wait() )。
  3. FreeBSD保留退出代码64+来创建定义良好的错误条件退出代码。

这就是标准的发展范围。 现在,实际上,大多数程序使用来表示简单成功,而使用非零代码来表示其他各种状态。 使用退出代码传递特定信息的程序通常在手册页中对其进行描述。

例如,如果您查看GNU cmp

退出状态0表示没有发现差异,1表示发现了一些差异,2表示有问题。

如注释中所述,如果任何命令执行返回0,则表示成功执行,而任何非零值表示执行该特定命令时出错。 执行命令后,返回值可以通过echo $?看到echo $? 在Unix中。 大多数情况下,非零返回值指示错误,即返回值是为已知错误预定义的。 这些也称为退出代码。

曾尝试对退出状态号进行系统化(请参阅/usr/include/sysexits.h),但这是供C和C ++程序员使用的。 类似的脚本标准可能是合适的。

出于shell的目的,成功执行了以零退出状态退出的命令。 非零退出状态表示失败。 使用了这种看似违反直觉的方案,因此存在一种明确定义的方式来指示成功,并且存在多种方式来指示各种故障模式。 当命令终止于编号为N的致命信号时,Bash使用值128 + N作为退出状态。

如果找不到命令,则为执行该命令而创建的子进程将返回状态127。如果找到但不能执行该命令,则返回状态为126。

如果命令由于扩展或重定向期间的错误而失败,则退出状态大于零。

如果所有Bash内置程序成功,则返回的退出状态为零,失败时返回的状态为非零,因此条件构造和列表构造可以使用它们。 所有内置插件均返回退出状态2,以指示使用不正确。

MSDOS退出代码只有1个字节,因此可能有一个先例。 Windows继续执行此标准,将退出代码限制在0到255之间。MSDOS/ Windows命令解释器将退出代码存储在名为ERRORLEVEL的命令解释器变量中,该变量可在批处理文件中使用。 还有一个名为%ERRORLEVEL%的环境变量,默认为ERRORLEVEL,但是可以将环境变量设置为ERRORLEVEL以外的其他值。 在某些情况下,退出代码用于C中的switch case语句之类的东西,而不是作为错误指示符。 我不确定如何使用退出代码* nix操作系统脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM