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