进程控制(二):进程等待
文章目录
- 进程控制(二)
- 进程等待
- wait函数
- waitpid函数
- wait/waitpid获取子进程状态码的过程
- 进程等待相关的宏
- 总结
进程控制(二)
延续对于上文进程结束,我们继续对于进程控制进行学习,本文我们主要是对于进程等待进行学习,进程等待,我们在前文初步接触进程的时候,我们知道,进程等待是指我们在运行该进程的时候,在等待资源,当有了资源分配后,便可以运行该进程,在本文中,我们认识的进程等待是指,子进程退出时,先进入僵尸状态,然后父进程进行等待(wait/waitpid)来获取子进程退出信息,这个过程叫做进程等待。
进程等待
进程等待,是子进程退出信息被父进程接收时,父进程处于等待状态的一种描述。
进程等待是指通过系统调用wait/waitpid,来进行对子进程进行状态检测与回收的功能。
- 子进程退出时,如果父进程没有接收信息,那么会导致僵尸进程的问题,造成内存泄漏,所以父进程必须通过进程等待来回收子进程退出信息。(必要)
- 通过回收子进程的退出信息,也可以知道子进程退出码,以及是否出现异常,status。(可选)
所以,我们必须要实现进程等待,防止内存泄漏,对于得到的子进程退出信息,我们可以选择性的利用,可有可无,看自己需求。
wait函数
wait函数,可以实现进程等待,只有一个参数,status,输出型参数,可以获得子进程退出信息

wait函数在2号手册上,头文件也可以表明,wait函数以及waitpid函数是系统调用接口,通过该函数来访问操作系统,使得操作系统对于子进程进行回收处理。

core dump,以后会用到,现在不需要掌握,只需要知道,这是用来进行调试的。
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>#define N 10void RunChild()
{int cnt=5;while(cnt){printf("Child pid: %d, parent pid: %d\n",getpid(),getppid());//获取pid和ppidsleep(1);cnt--;}//printf("Child pid: %d, parent pid: %d\n",getpid(),getppid());//获取pid和ppid//sleep(15);
}int main()
{//实现创建子进程,并对于子进程进行等待for(int i=0;i<N;i++){pid_t id=fork();//创建子进程if(id==0){RunChild();exit(i);//退出码}//父进程执行下面信息printf("create Child proc : %d success\n",id);}sleep(10);return 0;
}
上述代码,我们并没有是wait,会造成内存泄漏,下面我们来通过父进程来接收子进程的退出信息。
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>#define N 10void RunChild()
{int cnt=5;while(cnt){printf("Child pid: %d, parent pid: %d\n",getpid(),getppid());//获取pid和ppidsleep(1);cnt--;}//printf("Child pid: %d, parent pid: %d\n",getpid(),getppid());//获取pid和ppid//sleep(15);
}int main()
{//实现创建子进程,并对于子进程进行等待for(int i=0;i<N;i++){pid_t id=fork();//创建子进程if(id==0){RunChild();exit(i);//退出码}//父进程执行下面信息//wait;进程等待printf("create Child proc : %d success\n",id);}//进程等待for(int i=0;i<N;i++){//会实现进程的等待pid_t id=wait(NULL);//wait等待是随机的,等待还没有被接收信息的子进程,有几个子进程就需要等几次。//int status=0;//pid_t id=wait(&status);//传地址,操作系统来进行存储子进程退出信息if(id>0){//printf("wait %d success\n ; exit sig: %d\n",id,WEXITSTATUS(status));printf("wait %d success\n",id);}}return 0;
}
waitpid函数
waitpid函数,其拥有三个参数,功能相较于wait更多,可以认为waitpid可以包含wait的功能,wait的功能比较单一,智能获取状态码status,而且是随机等待子进程。
#include <sys/types.h>
#include <sys/wait.h>pid_t waitpid(pid_t pid, int* status, int options);
参数介绍
返回值pid_t:
- 大于0,表示等待子进程成功,返回值是子进程的pid
- 小于0,表示等待子进程失败
- 等于0,表示等待条件还没有就绪,此时父进程可以做自己的事情
pid参数:
- 大于0,表示等待指定的子进程
- pid = -1 ,表示等待随机子进程
status参数:
- NULL,表示不需要子进程的状态码
- 反之,作为输出型参数,操作系统将子进程退出信息写入status中
options参数:
- 0,表示阻塞等待
- WNOHONG,表示非阻塞等待

wait/waitpid获取子进程状态码的过程
wait和waitpid都是系统调用,为什么要通过系统调用函数,而不是库函数来实现该功能,这是因为,由于进程具有独立性,相互不影响,所以一般的函数无法访问到另一进程的内容,而系统调用,可以在全局上(操作系统的角度)来找到子进程PCB,得到状态码
等待流程
- 子进程运行完毕后,进入僵尸状态(Z),将退出码信息存储到子进程PCB中(exit_code,exit_signal),释放代码,以及数据,保留task_struct结构体信息。
- 父进程通过wait/waitpid,通过系统调用,得到子进程PCB中的退出信息,将推出信息,以位图的方式,写入到int类型的status参数,从而父进程得到子进程的推出信息。
exit_code:表示退出码
exit_signal:表示结束信号,也就是判断是否异常,如果为0,表示正常,如果非零,那就是接收了终止信号 kill -num,其中num==exit_signal
实现方式:
exit_signal == status&0x7F == WIFEXITED(status)
exit_code == status>>8&0xFF == WEXITSTATUS(status)
进程等待相关的宏
WEXITSTATUS(status):表示输出退出码(exit_code)
WNOHONG:表示非阻塞等待,用于waitpid的option参数。
WIFEXITED(status):通过状态码,表示子进程是否正常结束(是否异常),如果正常,返回ture
总结
进程等待,是父进程必须要完成的事情,是为了防止内存泄漏,也是为了知道子进程完成任务情况(由状态码得出结论),主要是了解wait/waitpid函数,以及status参数的构成,为什么能表示进程的三种退出情况,以及waitpid函数的非阻塞等待宏WNOHONG,还有退出码WEXITSTATUS,还有判断子进程是否正常退出的宏命令WIFEXITED。
相关文章:
进程控制(二):进程等待
文章目录 进程控制(二)进程等待wait函数waitpid函数wait/waitpid获取子进程状态码的过程进程等待相关的宏 总结 进程控制(二) 延续对于上文进程结束,我们继续对于进程控制进行学习,本文我们主要是对于进程…...
SWAT-MODFLOW地表水与地下水耦合模型的建模及应用
目录 第一讲 模型原理与层次结构 第二讲 QGIS软件 第三讲 基于QSWATMOD的SWAT-MODFLOW模拟 第四讲 QSWAT模型介绍与建模 第五讲 基于QGIS的数据制备 第六讲 基于CUP的SWAT参数率定 第七讲 MODFLOW模型讲解 第八讲 结果分析 更多应用 耦合模型被应用到很多科学和工程领…...
使用navicat操纵数据库
<1>连接数据库 打开Navicat,点击“连接”,选择“MySQL”,这边是本机安装的mysql,主机为localhost,输入root密码。 使用Navicat创建数据库并导入SQL文件 SQL查询 普通SQL查询 USE demo; SELECT * FROM t_emp;SELECT emp…...
websocket入门
一,什么是websocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议。 WebSocket有…...
Word里MathType插件符号表消失了
场景再现 在word里面编辑数学公式,结果符号表跑到屏幕外面了,找不到; 解决办法 在其中找到视图->工具栏,点击即可: 还嫌弃它跑到外边了,那就可以点击符号表的边框: 双击左边边框&#x…...
利用MySQL玩转数据分析之基础篇
知识无底,学海无涯,到今天进入MySQL的学习4天了,知识点虽然简单,但是比较多,所以写一篇博客将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。 1、SQL简述 1)SQL的概述 S…...
【ML】分类问题
分类问题 classification:根据已知样本特征,判断输入样本属于哪种已知样本类。 常用入门案例:垃圾邮件检测、图像分类、手写数字识别、考试通过预测。 分类问题和回归问题的明显区别: 分类问题的结果是非连续型标签,…...
python @classmethod装饰器作用 与 使用 类方法 实例方法
1 表示是类方法, 类方法可以修改类变量, 实例方法不能修改类变量 类方法可以访问和修改类变量(也称为类属性)。这是实例方法做不到的,因为实例方法只能访问和修改实例变量(也称为实例属性) 1.1 例子 class MyClass:…...
layui form 中input输入框长度的统一设置
Layui.form中使用class"layui-input-inline"就可轻松将元素都放到一行,但如果元素过多,就会自动换行。那就需要手动设置input框的长度。 像这种情况: 其实只需要添加css样式就可修改了 .layui-form-item .layui-input-inline {wid…...
【WSL/WSL 2-Redis】解决Windows无法安装WSL Ubuntu子系统与Redis安装
前言 在现代计算环境中,开发人员和技术爱好者通常需要在不同的操作系统之间切换,以便利用各种工具和应用程序。在这方面,Windows用户可能发现WSL(Windows Subsystem for Linux)是一个强大的工具,它允许他们…...
数据结构(四)--队列及面试常考的算法
一、队列介绍 1、定义 与栈相似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO,即先进先出。 2、优缺点及使用场景 优点:先进先出(FIFO&…...
PMIC、电源管理MAX77646ANP、MAX77647AANP、MAX77675AEWE、MAX77847AEWL DC-DC 开关稳压器
一、MAX77646ANP、MAX77647AANP 低IQ SIMO PMIC支持原电池应用的1.8V工作电压 MAX77646/MAX77647为尺寸和效率至关重要的低功耗应用提供电源解决方案。该IC集成单电感多输出(SIMO)降压/升压稳压器,可通过单个电感提供三个可独立编程的电源轨,尽可能地减…...
5W2H分析法:全面思考和解决问题的实用工具
5W2H分析法又叫七问分析法,创于二战中美国陆军兵器修理部。发明者用五个以W开头的英语单词和两个以H开头的英语单词进行设问,发现解决问题的线索,寻找发明思路,进行设计构思,从而搞出新的发明项目。5W2H简单、方便&…...
01 向量基本概念
向量基本概念 向量是什么物理专业学生视角计算机专业学生视角数学家视角 不同视角之间的关系 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 向量是什么 物理专业学生视角 向量是空间中的箭头。向量的长度和方向确定一个向量。只要长度和方向相同,…...
QMS质量检验管理|攻克制造企业质量检验难题,助力企业提质增效
在日益激烈的市场竞争中,对产品质量严格把关,是制造企业提高核心竞争力与品牌价值的关键因素。那如何高效、高质地完成产品质检工作?这就需要企业在工业质检中引进数字化技术加以辅助,进而推动智能制造高质量发展。 蓝库云QMS质量…...
Visual Components Robotics OLP解决方案 北京衡祖
Visual Components 引入了“Visual Components Robotics OLP”的重大升级,合并了制造模拟和机器人离线编程。该解决方案利用 Delfoi Robotics 的技术,提高生产率、减少停机时间并减少浪费。 一、探索下一代离线机器人编程软件 自 1999 年以来࿰…...
React——简便获取经纬度信息
引言 在现代的Web应用程序中,获取用户的地理位置信息是一项常见的需求。通过获取经纬度信息,我们可以为用户提供个性化的服务和定位功能。在本文中,我们将介绍如何在React应用程序中简便地获取用户的经纬度信息,并提供相应的代码…...
如何修改设置360浏览器内核模式
360安全浏览器现有两种内核模式,即“极速模式”和“兼容模式” 极速模式 “极速模式”是以Blink(Webkit)为内核的浏览模式,Blink内核具有更高的网页浏览速度和更好网页渲染效果。但由于少部分网银、政府、税务、办公系统等网站对B…...
spring boot 定时任务@Scheduled(cron = ““)不可用时并且注入失败时——笔记
以下方案是本人使用定时任务时Service注入失败的解决方案 在 Spring Boot 中执行定时任务时,你可以注入并直接调用 Service 中的方法,就像在普通的业务逻辑中一样。 以下是执行定时任务时调用 Service 的步骤: 创建一个 Service 类…...
R语言用jsonlite库写的一个图片爬虫
以下是一个使用R语言和jsonlite库下载图片的程序。首先,我们需要导入jsonlite库和options()函数,然后将代理服务器的主机名和端口号设置为"duoip"和"8000"。接着,我们将URL设置为"https://yun.baidu.com/"&…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
