c++ - 奇怪地改变状态码

标签 c++ c linux

<分区>

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

int main() { 
    return 2000;
}

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

echo $?

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

最佳答案

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

作为 Mystical pointed out2000 % 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/

相关文章:

c++ - Qt 5 样式 : dynamically load qml files

c++ - C/C++ 内存占用,每个源文件

c - 通过从二进制文件中加载结构数据并加载到 C 中的 gtk 列表存储中,出现内存问题

c++ - Linux 的 fork 函数与 Windows 的 CreateProcess 相比——复制了什么?

C++字节流

c++ - 我如何在 Qt 中的小部件下绘制阴影?

c++ - 为什么 printf 函数族关心语言环境?

linux - sed 无法处理 bash 脚本中的变量;请求一个文件。简单例子

linux - shell脚本中的top命令

java - 通过shell脚本在Java程序中从计算机读取图像文件