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.

相关推荐
挨踢攻城9 分钟前
Linux 安全 | 使用 iptables 测量流量
linux·服务器·安全·iptables·linux安全·厦门微思网络·测量流量
挺6的还34 分钟前
42.传输层协议TCP(一)
linux
阿方索1 小时前
DHCP 服务器
linux·运维
春夜喜雨1 小时前
linux下如何检查与设置程序与服务崩溃时生成coredump文件--包括systemctl启动的服务
linux
小狗爱吃黄桃罐头1 小时前
正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统
linux·驱动开发·学习
小心草里有鬼1 小时前
Linux 数据库 Mysql8 主从复制
linux·运维·数据库·sql·mysql
czhc11400756631 小时前
Linux925 shell 变量:本地、环境变量、全局变量;数组:普通数组、关联数组;交互定义、basename、dirname
linux·交互
chen_note1 小时前
Keepalived两个集群实验
linux·服务器·数据库·keepalived·高可用集群
Akshsjsjenjd1 小时前
HAProxy 使用指南:从基础到实战部署
linux·负载均衡
黄昏恋慕黎明2 小时前
javaEE初阶 网络编程(socket初识)
运维·服务器·网络