【Linux102】26-include/sys/wait.h


公粽号「专注Linux」,专注Linux内核开发

Linux102系列会详细讲解Linux0.11版本中的102个文件,本文讲解linux0.11的第26个文件include/sys/wait.h的文件源码。

1.include/sys/wait.h的主要作用

这个sys/wait.h头文件的核心作用是:

定义解析子进程终止状态的宏(如WIFEXITED、WEXITSTATUS等),用于判断子进程是正常退出还是被信号终止,以及获取具体的退出码信号值。


声明wait和waitpid两个系统调用函数,用于父进程等待子进程结束获取其状态。


这些功能是进程管理的基础,尤其在多进程编程中,父进程通过这些函数可以有效地管理子进程的生命周期。


2.源码注释版本

本节涉及的文件:

😉【Linux102】19-include/sys/types.h定义跨平台的基础数据类型,为系统调用、库函数和应用程序提供统一的数据类型声明

#ifndef _SYS_WAIT_H
#define _SYS_WAIT_H
// sys/types.h头文件定义了一些基本数据类型(如pid_t,用于表示进程 ID)。
#include <sys/types.h>
// 这两个宏用于提取一个整数的低 8 位和高 8 位
// (使用八进制0377表示二进制11111111)。
#define _LOW(v)		( (v) & 0377)/*低8位*/
#define _HIGH(v)	( ((v) >> 8) & 0377)/*高8位*/
/* options for waitpid, WUNTRACED not supported */
// WNOHANG:值为 1,表示如果没有子进程退出,waitpid不会阻塞,而是立即返回 0。
#define WNOHANG		1
// WUNTRACED:值为 2,表示需要关注被暂停(stopped)的子进程
#define WUNTRACED	2
/**
* func descp: 状态解析宏(核心功能)
* 这些宏用于解析wait和waitpid函数返回的子进程状态码(stat_loc参数所指向的值),判断子进程的终止原因。
*/

// 作用:判断子进程是否正常退出:
// 如果状态码s的低 8 位为 0((s)&0xFF == 0),返回真(非 0),表示子进程通过exit或return正常退出。
#define WIFEXITED(s)	(!((s)&0xFF))
// 作用:判断子进程是否被暂停(stopped):
// 如果状态码s的低 8 位等于0x7F,返回真,表示子进程被信号暂停。
#define WIFSTOPPED(s)	(((s)&0xFF)==0x7F)
// 作用:获取子进程正常退出时的退出状态码:
// 仅当WIFEXITED(s)为真时有效,返回s的高 8 位(右移 8 位后取低 8 位),即子进程通过exit(n)传递的退出码n。
#define WEXITSTATUS(s)	(((s)>>8)&0xFF)
// 作用:获取导致子进程终止的信号编号:
// 当子进程被信号终止时有效,返回s低 8 位中的低 7 位(&0x7F),即终止子进程的信号值。
#define WTERMSIG(s)	((s)&0x7F)
// 作用:获取导致子进程暂停的信号编号:
// 当WIFSTOPPED(s)为真时有效,返回s的高 8 位,即暂停子进程的信号值。
#define WSTOPSIG(s)	(((s)>>8)&0xFF)
// 作用:判断子进程是否被信号终止:
// 通过位运算判断状态码s是否表示子进程被信号杀死,返回真表示是信号导致的终止。
#define WIFSIGNALED(s)	(((unsigned int)(s)-1 & 0xFFFF) < 0xFF)
// 声明wait函数:
// 功能:阻塞等待任意一个子进程终止,并获取其终止状态。
// 参数:stat_loc指向一个整数,用于存储子进程的终止状态(可通过上述宏解析)。
// 返回值:成功返回终止的子进程 ID(pid_t类型),失败返回 - 1。
pid_t wait(int *stat_loc);
// 声明waitpid函数(更灵活的等待函数):
// 功能:等待指定的子进程,可通过选项控制是否阻塞。
// 参数:
// pid:指定要等待的子进程 ID(特殊值:-1 表示任意子进程,0 表示同组子进程等)。
// stat_loc:同wait,用于存储子进程终止状态。
// options:选项参数(如WNOHANG表示非阻塞)。
// 返回值:成功返回终止的子进程 ID,无子进程退出且使用WNOHANG时返回 0,失败返回 - 1。
pid_t waitpid(pid_t pid, int *stat_loc, int options);

#endif

3.源码完整版

#ifndef _SYS_WAIT_H
#define _SYS_WAIT_H

#include <sys/types.h>

#define _LOW(v)		( (v) & 0377)
#define _HIGH(v)	( ((v) >> 8) & 0377)

/* options for waitpid, WUNTRACED not supported */
#define WNOHANG		1
#define WUNTRACED	2

#define WIFEXITED(s)	(!((s)&0xFF)
#define WIFSTOPPED(s)	(((s)&0xFF)==0x7F)
#define WEXITSTATUS(s)	(((s)>>8)&0xFF)
#define WTERMSIG(s)	((s)&0x7F)
#define WSTOPSIG(s)	(((s)>>8)&0xFF)
#define WIFSIGNALED(s)	(((unsigned int)(s)-1 & 0xFFFF) < 0xFF)

pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid, int *stat_loc, int options);

#endif

4.源码图像版

include/sys/wait.h源码图像版

5.源码注释版图像

include/sys/wait.h源码注释图像版



汇编语言

😉【汇编语言】1—基础硬件知识

😉【汇编语言】2—寄存器基础知识

😉【汇编语言】3-寄存器与内存的交互

😉【汇编语言】4-第一个完整的汇编程序

😉【汇编语言】5-[BX]和loop指令

😉【汇编语言】6-包含多个段的程序

😉【汇编语言】7-灵活的5大寻址方式

😉【汇编语言】8-1-数据的位置

😉【汇编语言】8-2-数据的长度

😉【汇编语言】8-数据处理的两个基本问题(位置与长度)

😉【DOSBox】1-debug

😉【DOSBox】2-debug可执行文件

😉【DOSBox】3-完整开发流程


C语言

本系列将直击C语言的本质基础,流利处理出各个易错、实用的实战点,并非从零开始学习C。

😉【C语言】C Token(C89 C99 C11)

😉【C语言】指针基础

😉【C语言】数组基础

😉【C语言】结构体对齐

😉【C语言】华为C语言进阶测试

😉【C语言】触发刷新到磁盘的方式总结

😉【C语言】C语言文件操作的mode详解

😉【C语言】C语言文件知识全讲解

😉【C语言】从extern到头文件包含的最优实践

😉【C语言】C语言的关键字与重载机制

😉【C语言】长字符串的2种处理方式

😉【C语言】C语言嵌入汇编程序

😉【C语言】指针数组 VS 数组指针 原来这么简单!

😉【C语言】深浅拷贝、传参、赋值 本质剖析

😉【C语言】find-in-linux递归搜索文件名函数

😉【C陷阱与缺陷】-1-词法陷阱

😉【C陷阱与缺陷】-2-语法陷阱

😉【C陷阱与缺陷】-3-语义陷阱


Linux101系列

专注讲解Linux中的常用命令,共计发布100+文章。

😉【Linux101-1】ls

😉【Linux101-1】ls -l命令输出结果全解析

😉【Linux101-2】cd

😉【Linux101-3】cat

😉【Linux101-4】tac

😉【Linux101-5】head

😉【Linux101-6】tail

😉【Linux101-7】pwd

😉【Linux101-8】touch

😉【Linux101-9】cal

😉【Linux101-10】bc

😉【Linux101-11】df

😉【Linux101-12】uname

😉【Linux101-13】mkdir

😉【Linux101-14】gzip

😉【Linux101-15】tar

😉【Linux101-16】lsof

😉【Linux101-17】du

😉【Linux101-18】stat

😉【Linux101-19】top

😉【Linux101-20】echo


Linux102系列

本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。

😉【Linux102】1-Makefile

😉【Linux102】2-Makefile.header

😉【Linux102】3-system.map

😉【Linux102】4-bootsect.s

😉【Linux102】5-setup.s

😉【Linux102】6-head.s

😉【Linux102-D】/boot

😉【Linux102】7-main.c

😉【Linux102】8-kernel/asm.s

😉【Linux102】9-kernel/traps.c

😉【Linux102】10-kernel/printk.c

😉【Linux102】11-kernel/vsprintf.c

😉【Linux102】12-include/stdarg.h

😉【Linux102】13-kernel/mktime.c

😉【Linux102】14-kernel/system_call.s

😉【Linux102】15-1-task_struct 进程结构体

😉【Linux102】15-include/linux/sched.h

😉【Linux102】18-include/signal.h

😉【Linux102】19-include/sys/types.h

😉【Linux102】20-include/linux/kernel.h

😉【Linux102】21-include/asm/segment.h

😉【Linux102】22-include/linux/head.h

😉【Linux102】23-include/linux/mm.h

😉【Linux102】24-include/linux/fs.h

😉【Linux102】25-include/errno.h


Linux内核精讲系列

和Linux内核102系列不同,本系列将会从全局描绘Linux内核的各个模块,而非逐行源码分析,适合想对Linux系统有宏观了解的家人阅读。

😉【Linux】学习Linux前必备的知识点

😉【Linux】Linux内核对进程的内存抽象

😉【Linux】Linux概述1-linux对物理内存的使用

😉【Linux】软件从写下到运行的全部流程

😉【Linux】CPU的三寻址:实模式、保护模式、长模式

😉【Linux】实模式与保护模式的寻址, 这次讲明白了!

😉【Linux】linux0.11的源码目录架构

😉【Linux】Makefile机制及基础详解

😉【Linux】编译并运行Linux0.11

😉【Linux】“进进内网文”—Linux的内核结构全貌

😉【Linux】linux的中断机制

😉【Linux】linux进程描述



关于小希

😉嘿嘿嘿,我是小希,专注Linux内核领域,同时讲解C语言汇编等知识。

我的微信:C_Linux_Cloud,期待与您学习交流!

加微信请备注哦


小希的座右铭:别看简单,简单也是难。别看难,难也是简单。我的文章都是讲述简单的知识,如果你喜欢这种风格:

不妨关注、评论、转发,让更多朋友看到哦~~~🙈

下一期想看什么?在评论区留言吧!我们下期见!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值