3

glibc 关于进程完成状态的文档指出宏 WEXITSTATUS 返回完成状态的低位 8 字节。

宏:int WEXITSTATUS (int status)

如果 WIFEXITED 的状态为真,则该宏从子进程返回退出状态值的低 8 位。

然而,/usr/include/sys/wait.h说:

# define WEXITSTATUS(status)    __WEXITSTATUS (__WAIT_INT (status))

并且,/usr/include/bits/waitstatus.h提到:

/* If WIFEXITED(STATUS), the low-order 8 bits of the status.  */
#define __WEXITSTATUS(status)   (((status) & 0xff00) >> 8)

除非我的字节序概念都搞砸了,否则8 位是怎么回事?还是 libc 假设数据以小端方式保存?

4

1 回答 1

4

这不是字节顺序问题。字节序是指数据在内存中的存储方式;在大端或小端机器上,(((status) & 0xff00) >> 8)提取第 15 位到第 8 位,即status宏参数的第 8 位到第 15 位最低有效位。

文档和评论令人困惑,因为状态指的是两个不同的东西。

退出的进程返回一个状态码。此退出状态int在源中具有类型(作为来自 的返回值main,或作为 的参数exit),但是,该值应介于 0 和 255 之间。

和系统调用也为调用者提供了一个wait返回。这种状态是不同的;原始退出状态的低 8 位现在位于 15 到 8 位。我假设文档说 WEXITSTATUS 返回“低 8 位”,因为从退出进程的角度来看,这是对退出状态的打包.waitpidstatus

于 2011-05-09T21:08:17.937 回答