[英]About STDIN,STDOUT,STDERR and return value
我可以通过对STDIN
, STDOUT
和STDERR
使用<
>
和2>
来重定向数据流。
不知何故,我把它们与返回值混淆了。
如果返回值为1
或2
如何理解?
如果返回值为-1
怎么理解?
break
可以退出循环,但继续执行以下代码, return
怎么样? 一旦看到return
,它将用返回码终止main()
,对吗?
为了回答这个问题,让我们参考C99标准。 如果您阅读7.20.4.3退出函数 ,则会发现以下语句:
5最后,控制权返回到主机环境。 如果
status
的值为零或EXIT_SUCCESS
,则返回实现定义的状态成功终止的形式。 如果status
值为EXIT_FAILURE
,则返回实现定义的状态,表示状态失败终止。 否则,返回的状态是实现定义的。
这里应该强调的是,C标准没有为退出状态指定任何特定的代码。 在上面的代码段中,您可以看到提到的零 ,但这纯粹是exit()
API的一部分。 改写句子的其余部分,可以将零映射到任何其他由实现定义的成功终止上。 同样,不能保证EXIT_SUCCESS
和EXIT_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+。
总结一下:
wait()
)。 这就是标准的发展范围。 现在,实际上,大多数程序使用零来表示简单成功,而使用非零代码来表示其他各种状态。 使用退出代码传递特定信息的程序通常在手册页中对其进行描述。
例如,如果您查看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.