Linux进程控制(等待)
进程等待
为什么要进行进程等待


进程等待是什么?

怎么进行进程等待?

回到我们之前进程状态的代码, 我们知道, 在这段代码中,父进程对子进程没有做任何的操作, 所以当子进程在退出后, 会一直处于僵尸状态。
如果想要对子进程进行处理 我们父进程调用wait/waitpid对僵尸进程进行回收
wait()

我们添加这一段, 让父进程去回收子进程

可以看到 一段时间后, 子进程已经进入了僵尸状态

然后又被父进程给回收掉了, 此时子进程进入X状态, 然后迅速被系统回收, 然后就只剩下父进程自己一个人在运行了
小总结
到目前为止:我们必须对子进程进行回收, 因为如果不回收会造成内存泄漏
wait()等待的是该进程的所有子进程

这段代码就是回收多个子进程的示例。
阻塞等待
如果父进程在wait的时候没有一个子进程进入了僵尸状态, 那么父进程就会一直在wait处阻塞

一个进程等待, 不一定是在等待硬件资源 例如这个 是在等待软件条件。
waitpid()

status参数

我们之前一直都是只提到了回收进程, 却还不知道该如何获得被回收进程的信息, 那么我们是如何获得被回收进程的信息的呢?
答案就是靠的这个status参数
status是一个输出型参数, 我们通过这个指针将函数内部的数据带出来

status一共有32个比特位, 我们只关心他的低16位:
其中低7位表示子进程退出时的终止信号, 第8个比特位我们叫做core dump标志, 这个我们后面在说(信号)
次低8位代表的是退出状态, 即进程退出时的退出码
子进程退出,一共有几种退出场景呢?
3种
1 代码运行完毕, 结果正确
2 代码运行完毕, 结果错误
3 代码异常终止
父进程等待, 期望获得子进程退出的哪些信息呢?
1 子进程代码是否异常
2 没有异常的话, 其结果对吗? 不对是因为什么呢?
为什么父进程一定要通过wait等系统调用来获得子进程信息?
因为进程之间具有独立性, 用户无法直接去拿到子进程的信息, 只有通过系统调用才行。
waitpid 的原理
我们知道, 当子进程在退出的时候, 操作系统会释放掉子进程的代码和数据, 但是一定不会释放掉子进程的pcb, 而这pcb里就保存的有子进程的退出信息

可以看到在test_struct中, Linux对退出信息的描述
父进程在调用wait后, 系统就会去子进程的pcb里找到这些退出信息, 然后将它返回给父进程
为什么一定要调用系统调用, 而不能用户自己去子进程里找
因为父子进程虽然之间有一定的联系, 但是终究还是两个进程, 而进程是具有独立性的,要想在一个进程中获取另外一个进程的信息, 就得去访问他的pcb, 而pcb是Linux操作系统管理的资源, 我们普通用户是无法直接去访问操作系统内部管理的资源的。
进程在等待的时候, 什么时候会等待失败呢?

通过查看man手册, 我们发现wait在等待成功的时候会返回子进程的pid, 这个我们之前了解到了, 但是还有一种可能, 那就是等待失败的时候会返回-1, 什么情况下会等待失败呢?
其实很简单, 就是当你等待的进程不是你的子进程的时候, 此时就会等待失败

如图, 我们本来是应该去等待pid为id的进程, 但是我们这里等待了id +4的进程。

运行一下发现果然等待失败了。
关于status的宏
WIFEXITED与WEXITSTATUS


options参数
讲完了waitpid的前两个参数, 我们现在来谈谈第三个参数吧
这个参数其实就是觉得我们父进程在等待子进程时所采用的等待方案
阻塞等待
比如我们之前一直在使用的0就是阻塞等待:
也就是当父进程在等待子进程时会进入阻塞状态, 知道子进程结束了, 被父进程回收了, 才会恢复运行状态。
非阻塞轮询
还有一种状态叫做非阻塞轮询
想要以这种方式等待进程, 我们需要给options传递一个宏- WNOHANG
此时, 父进程在等待子进程的时候, 不会进入阻塞状态, 而是进行非阻塞轮询 + 自己的事
在阻塞等待的时候, 我们可能会得到两种返回值
1 ret > 0 等待成功, 返回等待到的子进程的pid
2 ret < 0 等待失败, 你想等待的进程不是你的子进程, 返回-1
在非阻塞轮询中还会有另外一种返回值ret == 0 此时代表我们在调用wait时子进程还未就绪(结束)

我们以这段代码做示范

可以看到, 父进程在等待子进程的时候, 如果此时子进程没有结束, 那么父进程会反复的调用wait, 直到子进程退出, 父进程等待成功
1 通常在非阻塞轮询的时候, 父进程做的事都是顺便做的, 不会去做一些工程量很大的事, 因为此时父进程的主要任务应当是去等待子进程, 而不是去执行自己的任务
2 并不是子进程退出后就必须马上将其回收, 等待一会再回收也是没问题的
3 通过进程等待可以保证父进程是所有进程中最后一个退出的进程。
相关文章:
Linux进程控制(等待)
进程等待 为什么要进行进程等待 进程等待是什么? 怎么进行进程等待? 回到我们之前进程状态的代码, 我们知道, 在这段代码中,父进程对子进程没有做任何的操作, 所以当子进程在退出后, 会一直处于…...
结构体-C语言
目录 前言 一、定义结构 结构体变量的创建和初始化 二、结构的特殊声明 特别注意: 结构的⾃引⽤ 三、结构体内存对⻬ 对⻬规则 优化结构体 #pragma 结构体传参 四、结构体实现位段 位段的内存分配 位段的跨平台问题 前言 C 数组允许定义可存储相同类…...
Unity DOTS中的baking(四)blob assets
Unity DOTS中的baking(四)blob assets blob assets表示不可变的二进制数据,在运行时也不会发生更改。由于blob assets是只读的,这意味着可以安全地并行访问它们。此外,blob assets仅限于使用非托管类型,这意…...
第三十天-Flask模板 Jinja2
目录 1.什么是模板 2.模板引擎Jinja2 默认配置 全局对象 全局函数 上下文处理器 3.模板中变量的使用 4.模板标签 条件判断if else for循环 添加注释 设置变量 转义显示 5.过滤器 过滤器使用 自定义过滤器 6.全局函数 7.模板中的宏 模板的基础 包含语法 8.…...
在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】
MySQL主从复制 MySQL主从复制介绍MySQL复制过程分成三步:1). MySQL master 将数据变更写入二进制日志( binary log)2). slave将master的binary log拷贝到它的中继日志(relay log)3). slave重做中继日志中的事件,将数据变更反映它自…...
Fragment 与 ViewPager的联合应用(2)
5.创建底部布局bottom_layout <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"horizontal"android:layout_width"match_parent"android:layout_height"55dp"android:background&qu…...
OriginBot智能机器人开源套件
详情可参见:OriginBot智能机器人开源套件——支持ROS2/TogetherROS,算力强劲,配套古月居定制课程 (guyuehome.com) OriginBot智能机器人开源套件 最新消息:OriginBot V2.1.0版本正式发布,新增车牌识别,点击…...
Java Web-Maven
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具 Maven的作用 1.依赖管理:方便快捷的管理项目依赖资源(jar包),避免版本冲突问题 我们有的项目需要大量的jar包,采用手动导包的方式非常繁琐,并且版本升级也…...
.Net 异步委托
委托的 BeginInvoke 方法和 EndInvoke 方法可以实现异步执行委托方法。这允许委托的方法在后台线程中执行,而不会阻塞当前线程。小编在之前的webform开发中遇到下载进度条卡死的问题就是用它解决的。 案例: namespace ConsoleApplication1 {class Progr…...
web前端面试题---->HTML、CSS
一.居中方法 block元素如何居中 margin:0 auto;position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);flex布局: 对父元素操作 : justify-content:center; al…...
移动端Web笔记day03
移动 Web 第三题 01-移动 Web 基础 谷歌模拟器 模拟移动设备,方便查看页面效果,移动端的效果是当手机屏幕发生了变化,页面和页面中的元素也要跟着等比例变化。 屏幕分辨率 分类: 硬件分辨路 -> 物理分辨率:硬件…...
c++的学习之路:3、入门(2)
一、引用 1、引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。 怎么说呢,简单点理解就是你的小名,家里人叫你小名&#…...
面试经典150题【91-100】
文章目录 面试经典150题【91-100】70.爬楼梯198.打家劫舍139.单词拆分322.零钱兑换300.递增最长子序列77.组合46.全排列39.组合总和(※)22.括号生成79.单词搜索 面试经典150题【91-100】 五道一维dp题五道回溯题。 70.爬楼梯 从递归到动态规划 public …...
在 nginx 中使用 JavaScript
前些日子尝试了在 nginx 中写 JavaScript 的效果。考虑到 JavaScript 作为编程语言不是强需求,在nginx生态上还是 lua 独大,并且还有 openresty 这样一直强力输血,大部分应用场景都能找到参考的解决方案。 插件生态来说,github 上…...
【pytorch】安装合集
使用conda或者pip安装的指令 https://pytorch.org/get-started/previous-versions/ 测试pytorch_gpu是否可用的代码 # 测试pytorch是否安装成功 import torch print(torch.__version__) print(torch.cuda.is_available())...
【教程】PLSQL查看表属性乱码解决方法
一、前言 PL/SQL是Oracle数据库的编程语言,用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性,看看各个字段的注释,可是打开一看,居然是乱码的,如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…...
新书速览|Django 5企业级Web应用开发实战:视频教学版
掌握Django框架开发技能,实战投票应用系统和内容管理系统 本书内容 《Django 5企业级Web应用开发实战:视频教学版》精选当前简单、实用和流行的Django实例代码,帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容…...
excel创建和部分使用
一.excel导出是在开发中经常操作的内容,对于excel的导出也是有各种成熟的api组件 这里是最近的项目有通过ts处理,这里的内容通过ts ①引入const XlsxPopulate require("xlsx-populate"); const XLSXChart require("xlsx-chart"); 通过命令行操作, pnp…...
pycharm使用远程服务器的jupyter环境
1、确保服务器上安装了jupyter,如果没有,执行下面命令安装 pip install jupyter2、启动jupyter notebook服务 jupyter notebook --no-browser --port8888 --ip0.0.0.0 --allow-root表明在服务器的8888 端口上启动 Jupyter Notebook,并允许从任何 IP 地…...
ES6 基础
文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得」JavaScript语言可以用来编写复杂的大型应用程序,成为…...
从游戏机到影音中心:用wiliwili解锁Switch的隐藏娱乐潜能
从游戏机到影音中心:用wiliwili解锁Switch的隐藏娱乐潜能 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端,目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwil…...
船舶水动力学与运动控制技术指南:从理论建模到工程实践
船舶水动力学与运动控制技术指南:从理论建模到工程实践 【免费下载链接】FossenHandbook Handbook of Marine Craft Hydrodynamics and Motion Control is an extensive study of the latest research in marine craft hydrodynamics, guidance, navigation, and co…...
如何用Obsidian Image Converter实现图像高效管理?超实用技巧分享
如何用Obsidian Image Converter实现图像高效管理?超实用技巧分享 【免费下载链接】obsidian-image-converter ⚡️ Convert, compress, resize, annotate, markup, draw, crop, rotate, flip, align images directly in Obsidian. Drag-resize, rename with variab…...
DNS负载均衡的5个认知误区:为什么你的轮询总不生效?(附排查指南)
DNS负载均衡的5个认知误区:为什么你的轮询总不生效?(附排查指南) 当我们在讨论DNS负载均衡时,常常会遇到一些根深蒂固的误解。这些误解不仅会影响系统设计决策,还可能导致运维人员在排查问题时走弯路。本文…...
intv_ai_mk11效果惊艳案例:为初创公司1小时生成完整BP商业计划书框架
intv_ai_mk11效果惊艳案例:为初创公司1小时生成完整BP商业计划书框架 1. 商业计划书生成效果展示 1.1 从零到完整的商业计划书 intv_ai_mk11在商业计划书生成方面展现出惊人的效率和质量。我们实测了一个真实案例:一家智能硬件初创公司需要准备融资用…...
高压柔性输电系统中的6脉冲与12脉冲晶闸管控制HVDC仿真模型说明文档
高压柔性输电系统6脉冲,12脉冲晶闸管控制HVDC的仿真模型,说明文档江湖上流传着这么一句话:"搞HVDC不玩晶闸管,就像吃火锅不放辣"。今天咱们就扒一扒那些藏在MATLAB/Simulink里的6脉冲和12脉冲换流器秘密。先说个冷知识&…...
vLLM-v0.17.1部署实战教程:3步启用OpenAI兼容API服务
vLLM-v0.17.1部署实战教程:3步启用OpenAI兼容API服务 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的速度和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发,现在已经发展成为一…...
YOLOv10镜像作品集:高清图像目标检测惊艳案例分享
YOLOv10镜像作品集:高清图像目标检测惊艳案例分享 1. 引言:YOLOv10带来的视觉革命 在计算机视觉领域,目标检测技术正经历着前所未有的变革。YOLOv10作为最新一代的目标检测模型,以其无与伦比的速度和精度重新定义了实时检测的标…...
Argos Translate:5分钟掌握开源离线翻译API的全面集成方案
Argos Translate:5分钟掌握开源离线翻译API的全面集成方案 【免费下载链接】argos-translate Open-source offline translation library written in Python 项目地址: https://gitcode.com/GitHub_Trending/ar/argos-translate Argos Translate是一款基于Ope…...
保姆级教程:用OpenAI Whisper给视频自动生成字幕(附Python代码)
视频创作者必备:用Whisper打造高效字幕工作流 每次剪辑视频最头疼的就是加字幕?作为过来人,我完全理解那种对着时间轴逐帧调整的痛苦。直到发现Whisper这个神器,我的工作效率直接翻了三倍。今天就把这套全自动字幕生成方案完整分享…...
