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