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.

相关推荐
福尔摩斯张2 小时前
TCP/IP网络编程深度解析:从Socket基础到高性能服务器构建(超详细)
linux·运维·服务器·开发语言·网络·网络协议·tcp/ip
Sleepy MargulisItG2 小时前
【Linux网络编程】传输层协议:TCP
linux·网络·tcp/ip
卡布叻_星星2 小时前
Docker之Windows与Linux不同架构部署理解
linux·windows·docker
北北~Simple2 小时前
解析百度分享链接,到自己服务器上
运维·服务器·dubbo
韩zj2 小时前
服务器定时备份数据库脚本
服务器·数据库·adb
Cat God 0072 小时前
基于 CentOS 7.6 的 MySQL 8.0 主从复制
linux·服务器·mysql·centos
LiYingL2 小时前
AlignGuard-LoRA:一种结合了高效微调和安全保护的新正则化方法
服务器·安全
春日见2 小时前
如何跑通,吃透一个开源项目?
linux·运维·开发语言·数码相机·matlab
Blueeyedboy5213 小时前
服务器监控工具-netdata
运维·服务器
TG:@yunlaoda360 云老大3 小时前
华为云国际站代理商DSS的跨区域备份与恢复具体是如何实现的?
运维·服务器·华为云