<分区>
我有一个简单的程序来测试退出代码:
int main() {
return 2000;
}
如果我运行该程序,请在终端中输入:
echo $?
终端回复208
。什么?为什么要这样做?
<分区>
我有一个简单的程序来测试退出代码:
int main() {
return 2000;
}
如果我运行该程序,请在终端中输入:
echo $?
终端回复208
。什么?为什么要这样做?
最佳答案
虽然 main
的返回值是一个 int
(通常是 32 位),但只有 8 位的退出代码被传递给操作系统的其余部分。
作为 Mystical pointed out ,2000 % 256 = 208
。
在 Linux 中,父进程通过调用 wait
or waitpid
(通常在子进程 exit
之后)来检索子进程的状态。该调用提供了一个状态值——在此 int
中编码的是 child 的退出代码,以及其他几个字段,指示 child 是否/如何退出等。退出代码是通过 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
错误代码被截断为八位,并填充到传递给 do_exit
的代码的第 15:8 位。
相关问题:
关于c++ - 奇怪地改变状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106949/