奇怪的改变状态代码

时间:2013-10-01 02:22:05

标签: c++ c linux

我有一个简单的程序来测试退出代码:

int main() { 
    return 2000;
}

如果我运行程序,在终端中键入:

echo $?

终端回复208。什么?为什么会这样做?

3 个答案:

答案 0 :(得分:6)

虽然main的返回值是int(通常是32位),但只有8位退出代码被传送到操作系统的其余部分。

作为Mystical pointed out2000 % 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标准仅定义了三个返回码:0EXIT_SUCCESSEXIT_FAILURE。 (通常,EXIT_SUCCESS 0,但我不认为这在技术上是必需的。)

如果状态返回为0EXIT_SUCCESS,则“将[实现定义的状态成功终止]返回[到主机环境]”。如果是EXIT_FAILURE,则返回“终止失败”。

任何其他返回代码都是实现定义的。您的实现定义状态返回2000返回208到主机环境。完全属于这样做的权利。