too*_*ley 5 c history historical-unix exit-status
stdbool.h 通常定义为:
#define false 0
#define true 1
Run Code Online (Sandbox Code Playgroud)
而 unix 程序false- 只有一个不成功的状态代码,被定义为:
int
main(int argc, char *argv[])
{
return (1);
}
Run Code Online (Sandbox Code Playgroud)
为完整起见,unix 程序的定义true是:
int
main(int argc, char *argv[])
{
return (0);
}
Run Code Online (Sandbox Code Playgroud)
很明显,它与falsestdbool.h中的值完全相反。我使用了OpenBSD的版本,因为 coreutils 的版本更冗长
使这些不同的历史原因是什么?
程序失败的原因有多种。例如grep,如果找不到所需的模式,或者无法打开指定的文件之一,则会失败。
目前,Unix 允许 1 个(无符号)字节值(返回码)从子级传递回其父级(我忽略了有关哪个信号杀死了子级、是否生成了核心等信息,这可能会得到更多信息)位回来)。
由于失败的方式有多种,因此有多个返回代码来编码这些不同的失败,并有一个返回代码来指示成功是有意义的。
由此可见,( 0) 是表示成功的合理选择,其余 (1-255) 表示失败(以及失败的类型)。
完全有可能使用 17 表示成功,并使用 0 到 16 和 18 到 255 表示失败,但为了简单起见,选择 0 表示成功,选择 1 到 255 表示失败,因此有一个范围。同样简单的是使用 255 表示成功,使用 0 到 254 表示失败。然而,这将限制未来的更改以回传超过 8 位,并保持单个故障代码范围的简单性。
我只能想到这个理由,而且对我来说似乎相当有力。
将布尔运算转换为计算机算术的最简单方法是使用0forFALSE和1for TRUE,然后使用它们进行的所有运算都有意义,即
TRUE && TRUE = TRUE ( 1 * 1 = 1)
TRUE && FALSE = FALSE ( 1 * 0 = 0)
TRUE || FALSE = TRUE ( 1 + 0 = 1)
FALSE || FALSE = FALSE ( 0 + 0 = 0)
Run Code Online (Sandbox Code Playgroud)
等等等等。
同时程序需要多种退出状态来报告各种错误。将正确的退出状态设置为0,然后使用剩余的 255 (无符号字符)作为错误的退出状态是合乎逻辑的。
当然,现在本来1可以取得良好的退出状态,但随后糟糕的退出状态就会变成一堆撕裂的阵列0,2..555这是非常不合逻辑的。