4

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

int main() { 
    return 2000;
}

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

echo $?

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

4

3 回答 3

6

虽然返回值为mainan int(通常为 32 位),但只有 8 位退出代码与操作系统的其余部分通信。

正如神秘主义者指出的那样2000 % 256 = 208

在 Linux中,父进程通过调用waitorwaitpid(通常在子进程之后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

相关问题:

于 2013-10-01T02:29:47.527 回答
2

UNIX 错误代码是一个字节大,所以你的值被削减到它的余数 mod 256,即 208。

于 2013-10-01T02:24:21.200 回答
2

C 标准只定义了三个返回码0EXIT_SUCCESSEXIT_FAILURE。(通常EXIT_SUCCESS 0,但我认为这在技术上不是必需的。)

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

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

于 2013-10-01T02:42:52.540 回答