Answers:
因为在UNIX / POSIX中,程序的退出代码被定义为无符号的8位值。将-1转换为无符号的8位将得到255。
编辑添加:
详细说明:UNIX中的wait *()系列系统调用将处理结果编码为单个32位整数。该结果的32位被进一步分解,以提供诸如进程是否转储核心,是否由于信号(以及哪个信号)而退出等信息。在这32位中,只有8位保留给进程的退出代码那些被解释为无符号值。
UNIX / POSIX的fork / exec / wait模型是其最古老,最深入的特性之一。如果今天要设计一个新的操作系统,则可能会做一些不同的事情(至少使用64位:-)。
另一方面,实际上,> 255个退出代码真的有用吗?我对此表示怀疑。如果您确实想要更强大的功能,建议您改用“退出字符串”,而不是范围更广的数字退出代码。
引用退出状态bash
手册页
已执行命令的退出状态是waitpid系统调用或等效函数返回的值。退出状态介于0到255之间,但是,如下所述,shell可能会特别使用125以上的值。Shell内置命令和复合命令的退出状态也限制在此范围内。在某些情况下,外壳将使用特殊值来指示特定的故障模式。
因此,将其限制在该范围内,我实际上和您一样感到惊讶。
从waitpid (2)
手册页:
WEXITSTATUS(status)
返回子项的退出状态。它由状态参数的最低有效8位组成,该状态参数是子对象在对exit(3)或_exit(2)的调用中指定的或作为main()中return语句的参数指定的。仅当WIFEXITED返回true时才应使用此宏。