linux下的进程等待(wait、waitpid)

目录

引言

进程等待的必要性

见见猪跑:是什么

怎么办

多个子进程时

阻塞等待

非阻塞轮询

参数一:

参数二

进程等待的原理

进程退出相关的宏

第三个参数option(设置等待的方式)


引言

在Linux操作系统中,进程控制是核心功能之一。进程的创建、执行、终止以及资源管理都是操作系统管理任务的重要组成部分。特别是在多进程编程中,进程间的同步和资源回收显得尤为重要。本文将重点介绍Linux系统中进程等待的机制,特别是waitwaitpid这两个系统调用。

进程等待的必要性

之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。
因此,为了获取这些信息,进程等待是必要的!
我们将通过进程等待是什么、为什么两步去完成讲解。

见见猪跑:是什么

先建立一个多进程的程序,观察现象。

perror:将错误码转化成错误码描述

如果打开文件错误,perror("file:"),那么打印结果是file: No such file or directory 

现象

子进程跑完循环之后退出,父进程一直执行。

发现子进程变成了僵尸,状态是Z,后面还跟着defunct备注。

怎么办

处理:wait等待子进程使之从z变成x

头文件在sys/types.h和sys/wait.h

等待成功之后返回pid,等待失败返回-1。子进程未结束返回0(wait默认情况下是阻塞等待)。

wait需要传入一个指针参数(后续讲解)

现象:

子进程由S----Z----正确退出释放。

多个子进程时

创建时,子进程执行结束接着退出,所以父进程执行继续循环,会创建多个子进程。

fork success是父进程的输出,可以看到,父子进程并不是有严格的执行规律

后去全部可以等待成功。

wait等待是一种泛型等待,只要你是父进程的子进程,那么wait就可以去等待。

阻塞等待

如果wait等待的子进程都不结束,那么父进程会一直停留在wait处等待子进程。

因此进程阻塞不只是进程在等待硬件资源的响应,在等待软件资源的响应时,也会造成阻塞!

非阻塞轮询

为了让父进程“有活干”,就不能让父进程一直阻塞在wait处。waitpid()接口可以实现非阻塞轮询。

返回值:
当正常返回的时候 waitpid 返回收集到的子进程的进程 ID
如果设置了选项 WNOHANG, 而调用中 waitpid 发现没有已退出的子进程可收集 , 则返回 0
如果调用中出错 , 则返回 -1, 这时 errno 会被设置成相应的值以指示错误所在;
注意
waitpid(-1, nullptr,  0)等价于wait,进行泛型等待,并且是阻塞等待的方式(除非第三个参数设置为WNOHANG)
也可以等待成功

参数一:

直接传入子进程的pid(限制了等待对象)

参数二

这是一个输出型参数。获取进程的信息是通过status参数获取的

这两个接口的status含义一致

可以观察到status是256,并不是我们所“期待的 1”。

原因

进程的退出状态有三种

代码运行完毕,结果正确(0)
代码运行完毕,结果不正确(其他数字)                //这两种都是正常退出
代码异常终止(存在信号)
因此status必须表示这三个信息才能代表进程的退出状态。
对此status应该“分段”看待

当进程异常终止时(没执行完毕 )0-7bit为代表终止信号(signal信号)

信号最大为62,2^6所以用7个bite位表示(低七位

第八位:这是一个core dump标志,暂时不关心

次低八位:表示退出状态(退出码)

获得信息

exit signal(退出信号):status & 0x7F    (7F是0111 1111,按位与可得到低七位信息)

exit code(退出码) : (status >> 8 )& 0xFF         (FF是1111 1111 ,按位与 可得到次低八位信息)

不可以建立一个全局变量去获得相关的信息(写时拷贝、进程的独立性)

进程等待的原理

父进程获取子进程的内核pcb,并且将z状态改为x状态(在x状态下进行资源的释放)

为什么不直接去内核数据结构访问呢?父进程必须通过接口去访问子进程的pcb信息,OS不相信任何人

什么时候进程等待失败(不返回pid,返回-1)?只需要让第一个参数pid 随意 加减一个数字,让父子进程不匹配即可。(父进程只能回收自己的子进程)

进程退出相关的宏

WIFEXITED:检测子进程正常退出,返回非零值,否则返回0(wait if exited) 

WEXITSTATUS :正常退出时,获取退出码(wait exit status)

注意:前两个宏都得是退出的前两种状况:进程正常退出,而不是被信号所杀。

第三个参数option(设置等待的方式)

这就是我们所提及的非阻塞轮询。

如果第三个参数是0,那么仍然是阻塞轮询。

0:阻塞等待方式

用0的方式本身就会让父进程去等待子进程,让自己进入阻塞状态。

如果第三个参数设置为WNOHANG(wait no hang禁止等待),那么将不会停留在waitpid处。

非阻塞轮询由:非阻塞  +  循环构成

非阻塞ret有三种返回方式(都是立即返回,不会阻塞): 1.pid等待成功返回pid(跳出循环) 2.等待失败返回 -1 (跳出循环) 3.子进程还在运行返回0

阻塞等待

阻塞等待是指父进程在调用wait()或waitpid()函数时,如果没有子进程退出,父进程会暂停执行,直到有子进程退出。这是最常见的等待方式,适用于大多数IO类函数。在阻塞等待期间,父进程处于等待状态,无法执行其他任务。

非阻塞轮询

非阻塞等待是指父进程在调用waitpid()函数时,通过设置WNOHANG选项,即使子进程没有退出,父进程也不会暂停执行,而是立即返回继续执行其他任务。这种方式允许父进程在等待子进程的同时,执行其他操作,从而提高了程序的效率。

无论是阻塞等待还是非阻塞等待,父进程都是最后结束,因为父进程需要等待回收子进程(否则变成孤儿进程)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter实际应用

环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点,不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码,是要在jmeter中用的 keytool -import -ali…

Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

基于SSM+小程序的垃圾分类管理系统(垃圾2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的垃圾分类管理系统实现了管理员及用户。 1、管理员功能结构图,管理员功能有个人中心,管理员管理,基础数据管理、论坛管理、垃圾信息管理…

钰泰ETA4553电压电平转换器IC

描述 ETA4553 是两位同相转换器,是一种双向电压电平转换器,可用于建立混合电压系统之间的数字开关兼容性。它使用两个独立的可配置电源轨,A 端口支持 1.65V 至 5.5V 的工作电压,同时跟踪 VCCA 电源,B 端口支持 2.3V 至…

QT QDialog::exec()调用时清除部件所有焦点

最近在做项目时,遇到一个问题:在统信UOS系统编写的QT程序,其中进入某些页面时,或者显示模态窗时,按钮都会有一个焦点框,这个是不允许的,于是乎,开始了清理焦点的旅途。 一、清理QDia…

高速自爆穿梭无人机技术详解

高速自爆穿梭无人机技术是一种结合了高速飞行与自爆式攻击能力的先进无人机技术。以下是对该技术的详细解析: 一、技术特点 1. 高速飞行: 高速自爆穿梭无人机通常具备极高的飞行速度,如部分型号的速度可达到174公里/小时,甚至更…

五,Linux基础环境搭建(CentOS7)- 安装Kafka

Linux基础环境搭建(CentOS7)- 安装Kafka 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、Kafka下载及安装 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高…

[ARC159D] LIS 2 题解

[ARC159D] LIS 2 题面: 题面翻译 给定 n n n 个操作,每次操作给出 l , r l,r l,r,并在 a a a 序列里依次添加 i ∈ [ l , r ] i\in[l,r] i∈[l,r]。 求最后 a a a 的最长上升子序列。 题目描述 数列 $ X $ があります。初め、$ X $ は空…

网络搜索引擎Shodan(1)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:shodan(1)_哔哩哔哩_bilibili 本文主要讲解网络搜索引擎Shodan的一些用法(host和search这两个命令)。 Shodan 是一个网络…

Matlab学习02-matlab中的数据显示格式及符号变量

目录 一,关系运算和逻辑运算 二,变量 三,数据显示格式 四,符号运算 1,创建符号变量 2,数值矩阵转换成符号矩阵 一,关系运算和逻辑运算 在matlab中,只要数值不是 &#xff0…

jenkins下拉参数联动

需要安装Active Choices插件,官网地址: https://plugins.jenkins.io/uno-choice/ 安装完插件以后会出现Active Choices选项: 第一个参数: return ["dubbo-op-all-deployment1", "dubbo-op-all-deployment2",…

合并数组的两种常用方法比较

在 JavaScript 中,合并数组的两种常用方法是使用扩展运算符 (...) 和使用 push 方法。 使用扩展运算符 this.items [...this.items, ...data.items]; 优点: 易于理解:使用扩展运算符的语法非常直观,表达了“将两个数组合并成一个…

基于vue框架的的高校消防设施管理系统06y99(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:设备分类,设备信息,维修人员,报修信息,维修进度,院系,消防知识,培训记录,培训信息,备件信息,备件申请,派发信息,采购信息 开题报告内容 基于Vue框架的高校消防设施管理系统开题报告 一、项目背景与意义 随着高校规模的不断扩大和校园建…

基于Django+Python的房屋信息可视化及价格预测系统设计与实现(带文档)

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

无人机喊话器详解!

喊话器材料 外壳常采用尼龙纤维增强材料,这种材料具有抗摔、抗震、轻便、灵活、质量稳定、操作简单等优点,能够满足不同场景的需求。 喊话范围 无人机喊话器的喊话范围主要取决于设备的型号、环境条件以及喊话器的性能参数。一般来说,无人…

【334】基于springboot的仓库管理系统

本科毕业设计论文 题目:仓库管理系统设计与实现 摘 要 信息内容数据从传统到当今,一直在改变,忽然互联网技术让传统信息内容管理见到划时代的黎明,由于传统信息内容管理从时效性、安全系数、可执行性等多个方面,碰到…

rsync算法原理

1. 简介 rsync是一种文件同步的工具,也是一种算法。 2. 算法原理 背景:计算机 α \alpha α 上有文件 a, 计算机 β \beta β上有文件b。要对这两个文件进行同步。 β \beta β将文件b分成大小为S字节的若干块,最后一份可能不足S字节对于b…

中小企业设备维护新策略:Spring Boot系统设计与实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

安灯系统助力汽车零部件工厂快速解决生产异常

在汽车零部件制造领域,高效的生产管理和快速解决异常情况是确保产品质量和生产进度的关键。而安灯系统的应用,正为汽车零部件工厂带来了全新的变革,助力其快速解决生产异常。 汽车零部件工厂的生产报工产线看板直观地反映出生产的各项关键数据…

Redis的RDB执行原理

引入‘页表’的概念 Linux里面每个进程都是无法直接操作物理内存的,每个进程只能用页表映射本进程的虚拟内存到物理内存的映射。 bgsave的时候,主进程会fork(复制)一个子进程,然后该过程仅仅复制了页表。复制页表的过程…