我是 C++ 编程的新手,我有一个非常基本的问题。我注意到当我-1在 C++ 程序中返回然后检查退出状态时,我得到255. 这是为什么?
代码是最基本的:
int main()
{
return -1;
}
Run Code Online (Sandbox Code Playgroud)
然后,在运行编译后的代码后:
echo $?
255
Run Code Online (Sandbox Code Playgroud)
Mad*_*ist 29
因为在 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)
返回孩子的退出状态。这由子进程在调用 exit(3) 或 _exit(2) 或作为 main() 中返回语句的参数指定的状态参数的最低有效 8 位组成。仅当 WIFEXITED 返回 true 时才应使用此宏。
| 归档时间: |
|
| 查看次数: |
69477 次 |
| 最近记录: |