【问题标题】:Weirdly changing status codes [duplicate]奇怪的变化状态代码[重复]
【发布时间】:2013-10-07 01:37:28
【问题描述】:

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

int main() { 
    return 2000;
}

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

echo $?

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

【问题讨论】:

  • 退出代码的范围只有 256?那为什么还要强制 main 返回int
  • 因为语言是这样说的......(语言要求main返回int
  • @Mystical 我认为 OP 理解了为什么 standard 这么说。
  • 继承自 'C',与“toupper”等在值实际上是字符时采用 int 的原因相同。 'int' 曾经是一个包罗万象的通用“数字”。从那以后它变得更大了。

标签: c++ c linux


【解决方案1】:

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

作为Mystical pointed out2000 % 256 = 208

在 Linux 中,父进程通过调用 wait or waitpid(通常在子进程 exits 之后)检索子进程的状态。该调用提供了一个状态值 - 在此 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 位,并填充到传递给 do_exit 的代码的 15:8 位中。

相关问题:

【讨论】:

    【解决方案2】:

    UNIX 错误代码是一个字节大,因此您的值被削减到其余数 mod 256,即 208。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        相关资源
        最近更新 更多