waitpid的waitstatus 含义源码解读

当我们在调用pid_t waitpid(pid_t pid , int *stat_loc , int options )时,其中第二个参数stat_loc会提供子进程退出的详细信息,为此posix还提供了一组宏来解析这个status.

在\glibc\bits\waitstatus.h

/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */

#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)

/* If WIFSIGNALED(STATUS), the terminating signal. */

#define __WTERMSIG(status) ((status) & 0x7f)

/* If WIFSTOPPED(STATUS), the signal that stopped the child. */

#define __WSTOPSIG(status) __WEXITSTATUS(status)

/* Nonzero if STATUS indicates normal termination. */

#define __WIFEXITED(status) (__WTERMSIG(status) == 0)

/* Nonzero if STATUS indicates termination by a signal. */

#define __WIFSIGNALED(status) \

(((signed char) (((status) & 0x7f) + 1) >> 1) > 0)

/* Nonzero if STATUS indicates the child is stopped. */

#define __WIFSTOPPED(status) (((status) & 0xff) == 0x7f)

/* Nonzero if STATUS indicates the child continued after a stop. We only

define this if <bits/waitflags.h> provides the WCONTINUED flag bit. */

#ifdef WCONTINUED

define __WIFCONTINUED(status) ((status) == __W_CONTINUED)

#endif

/* Nonzero if STATUS indicates the child dumped core. */

#define __WCOREDUMP(status) ((status) & __WCOREFLAG)

/* Macros for constructing status values. */

#define __W_EXITCODE(ret, sig) ((ret) << 8 | (sig))

#define __W_STOPCODE(sig) ((sig) << 8 | 0x7f)

#define __W_CONTINUED 0xffff

#define __WCOREFLAG 0x80

我们重点看一下#define __W_EXITCODE(ret, sig) ((ret) << 8 | (sig)),其中:

ret是exit code,就是子进程在退出时,如果有调用exit()时,产生的exitcode. 比如子进程显示调用了exit(1),那么exitcode就是1。

sig是signal,比如SIGTERM,这时可以认为子进程是被动kill掉的,所以需要记录此时的SIGNAL。

示例:

pclose return 30720 = 0x7800, 0x78 = 120,

sys --- System-specific parameters and functions --- Python 3.13.3 documentation

Changed in version 3.6: If an error occurs in the cleanup after the Python interpreter has caught SystemExit (such as an error flushing buffered data in the standard streams), the exit status is changed to 120.

相关推荐
鹏大师运维3 小时前
为什么信创电脑装软件总提示“软件包架构不匹配”?
linux·运维·架构·国产化·麒麟·deb·统信uos
007张三丰3 小时前
软件测试专栏(11/20):测试框架开发:pytest深度解析与插件体系
运维·服务器·自动化测试·pytest·测试框架
weixin_604236675 小时前
华三 路由器 极简核心配置
运维·服务器·网络·h3c·h3c路由器
鹤落晴春5 小时前
【Linux复习】管理SELinux安全性
linux·运维·服务器
yz_aiks5 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd
bjzhang757 小时前
CentOS下安装MySQL详解
linux·mysql·centos
Jason_chen8 小时前
Linux 6.2 音频机制深度解析:AI驱动的低延迟音频与零信任音频安全架构
linux
下午写HelloWorld8 小时前
Linux系统及Ubuntu常用指令
linux·ubuntu·操作系统
lizhihai_999 小时前
股市学习心得-AI 产业链核心标的梳理清单
大数据·服务器·人工智能·科技·学习
weixin_5231853210 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端