我有一个简单的程序来测试退出代码:
int main() {
return 2000;
}
如果我运行程序,请在终端中键入:
echo $?
终端回复208
. 什么?为什么会这样做?
虽然返回值为main
an int
(通常为 32 位),但只有 8 位退出代码与操作系统的其余部分通信。
正如神秘主义者指出的那样,2000 % 256 = 208
。
在 Linux中,父进程通过调用wait
orwaitpid
(通常在子进程之后exit
)来检索子进程的状态。该调用提供了一个状态值——其中编码的int
是孩子的退出代码,以及其他几个字段,指示孩子是否/如何退出等。退出代码是通过WEXITSTATUS
宏提取的。
int status;
waitpid(childpid, &status, 0);
if (WIFEXITED(status))
printf("Child exited with code %d\n", WEXITSTATUS(status));
有趣的是,我在任何man
页面中都没有真正看到这一点!
但是如果我们看一下内核就很明显了:
在kernel/exit.c
中,我们看到了exit
系统调用的定义位置:
888 SYSCALL_DEFINE1(exit, int, error_code)
889 {
890 do_exit((error_code&0xff)<<8);
891 }
您可以在那里看到,int
错误代码被截断为 8 位,并填充到传递给的代码的 15:8 位中do_exit
。
相关问题:
UNIX 错误代码是一个字节大,所以你的值被削减到它的余数 mod 256,即 208。
C 标准只定义了三个返回码0
:EXIT_SUCCESS
和EXIT_FAILURE
。(通常EXIT_SUCCESS
是 0
,但我认为这在技术上不是必需的。)
如果状态返回是0
或EXIT_SUCCESS
,则“将状态成功终止的实现定义的形式返回[主机环境]”。如果是EXIT_FAILURE
,则返回“不成功终止”。
任何其他返回码都是实现定义的。您的实现定义返回 2000 的状态返回 208 到主机环境。它完全有权这样做。