进程等待讲解

news2024/11/27 14:52:16

今日为大家分享有关进程等待的知识!希望读完本文,大家能有一定的收获!

正文开始!


进程等待的引进

既然我们今天要讲进程等待这个概念!那么只有我们把下面这三个方面搞明白,才能真正的了解进程等待!

什么是进程等待!

进程等待:

进程等待就是通过系统调用wait/waitpid的方式,让父进程对子进程进行资源回收的等待过程!

为什么要有进程等待!

其中存在进程等待有两种原因

1.防止僵尸进程的产生!(必要的!)因为当子进程退出之后,如果父进程不及时回收子进程的资源时,会导致子进程一直处于僵死状态,就连kill-9也拿他没有任何办法,所以引进了进程等待来解决对操作系统资源的浪费!这一点原因是进程等待存在的必要!

2.既然通过了父进程创建了子进程,那么我们需要知道子进程将任务完成的如何了,此时就引进了进程等待!这也是进程等待存在的一种原因,但是这种原因不是必须的!

既然上面讲到了为什么要有进程等待,那么就不得不介绍进程等待是如何做到的,能满足上述的两种情况!

进程等待是怎么做到的!

想要了解进程等待是如何做到的,必须要了解有关进程等待的两个系统调用!

首先验证进程等待可以将僵尸进程进行回收!可以写一段代码,让子进程跑起来,然后退出,此刻让父进程先睡会儿,然后通过监视进程窗口观察子进程状态的变化即可验证!

代码如下:

通过复制渠道来进行监视进程的运行状态,其中监视进程的代码如下!:

while : ; do ps ajx |head -1&&ps ajx |grep mytest|grep -v grep; echo "-----------------------------"; sleep 1;done
 

通过上述的情况可以发现,的确可以通过wait函数将僵尸进程进行杀掉,那么是如何进行杀掉的呢?下面通过介绍两种等待进程的函数即可得到结论! 

1.wait

函数原型:pid_ t wait(int *status);

首先来介绍wait函数,此函数只有一个参数,是一个返回型参数!最后返回进程的状态!其返回值类型是pid_t 类型,如若进程等待成功,那么将会返回子进程的pid!!,如果在fork之前调用wait函数,那么就会出现结果为-1的情况!!

作用:进程一旦调用了wait,就会立刻阻塞自己,由wait分析当前进程中的某个子进程是否已经退出了,如果让它找到这样一个已经变成僵尸进程的子进程,wait会收集这个子进程的信息,并将它彻底销毁后返回;如果没有找到这样一个子进程,wait会一直阻塞直到有一个出现参数stat_loc用来保存被收集进程退出时的一些状态,它是一个指向int型的指针。但如果对这个子进程是如何死掉的不在乎,咱们可以将它设置为NULL:pid = wait(NULL);如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用会失败,wait返回-1,同时errno会被设置为ECHILD

2.waitpid

函数原型:pid_ t waitpid(pid_t pid, int *status, int options);

第一个参数:

相比较与wait函数来言,waitpid的参数有三个!其中第一个参数表示某个子进程的pid,若不想指定特定的子进程,只需要将第一个参数置为-1即可!-1指的是任意子进程!

第二个参数:

其中第二个参数和wait中的参数是一样的,是一种输出型参数,用于返回子进程退出的状态信息!

第三个参数:

第三个参数option代表的是进程的等待方式!其中默认0是阻塞等待方式

还有一种方式是WNOHANG,其代表的状态是非阻塞式等待!其中其返回值有三种类型!

当正常返回的时候waitpid返回收集到的子进程的进程ID;而调用中waitpid发现没有已退出的子进程可收集,则返回0;如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;其中要想看见具体的出错信息可以利用strerror函数来进行打印!

这里再介绍与一下linux中关于进程状态变量的存储方式!

可以看出如果想要观察进程的退出码信息,只需要将status的值右移8位然后按位与上1即可得到退出码的信息! 对于终止信号的信息来眼,只需要按位与一个0x1F即可获得终止信号信息!

退出码信息:
(status>>8)&0xFF

终止信号信息:

status&0x1F

那么是否有一种更简单的方式来获得进程退出码的信息呢?而不是每次都通过这些按位操作获取的呢?答案是肯定的!对此,C定义了宏,来获取退出码的信息!

1,WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值
(请注意,虽然名字一样,这里的参数status并不同于wait唯一的参数–指向整数的指针status,而是那个指针所指向的整数,切记不要搞混了。)
2, WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说, WIFEXITED返回0,这个值就毫无意义。(通俗的讲,如果一个进程异常的结束了,其返回值的结果就没有任何意义了!也可以举个生活中的例子,如果一个学生考试作弊被抓住,那么不管他考多少分都没有任何意义了!!!!)

扩展:

至此相关进程等待的知识,介绍的大致差不多了,也有一些同学可能会问到,为什么要通过系统调用来判断进程的状态呢?而不是直接使用一个全局变量status直接来观察呢?

这里我们就来解释一下为什么不能通过一个全局变量来判断进程状态,因为进程是独立的,所以对于每一个变量,都有一个自己的stauts,他们不能共享相同的status,因为进程要想修改一个共享的数据时,会引起写时拷贝的发生,所以他们各自都有一份自己的statues,所以不能仅仅通过一个简单的变量来观察进程的状态!


至此,有关进程等待的知识介绍完毕,如有错误,欢迎大家评论区积极指正,如果对您有一定的收获,欢迎留下免费的小心心!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

形象建设、生意经营、用户运营,汽车品牌如何在小红书一举多得?

随着小红书在多领域的持续成长,现在来小红书看汽车的用户,需求逐渐多元化与专业化。近1年的时间,有超过1亿人在小红书「主动搜索」过汽车内容,大家已经不仅限于玩车、用车,更是扩展到了百科全书式的看、选、买、学各个…

Python3 selenium 设置元素等待的三种方法

为什么要设置元素等待? 当你的网络慢的时候,打开网页慢,网页都没完全打开,代码已经在执行了,但是没找到你定位的元素,此时python会报错。 当你的浏览器或电脑反应慢,网页没完全打开,…

12、模块化编程

模块化编程 1、传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响便朝着的思路 2、模块化编程:把各个模块的代码放在不同的.c文件…

java--单继承、Object

java是单继承的,java中的类不支持多继承,但是支持多层继承。 反证法: 如果一个类同时继承两个类,然后两个类中都有同样的一个方法,哪当我创建这个类里的方法,是调用哪父类的方法 所以java中的类不支持多继…

PostgreSQL + SQL Server = WiltonDB

WiltonDB 是一个基于 PostgreSQL 的开源数据库,通过 Babelfish 插件支持 Microsoft SQL Server 协议以及 T-SQL 语句。 Babelfish 是亚马逊提供的一个开源项目,使得 PostgreSQL 数据库同时具有 Microsoft SQL Server 数据查询和处理的能力。Babelfish 可…

11、动态数码管显示

数码管驱动方式 1、单片机直接扫描&#xff1a;硬件设备简单&#xff0c;但会消耗大量的单片机CPU时间 2、专用驱动芯片&#xff1a;内部自带显存、扫描电路&#xff0c;单片机只需告诉他显示什么即可 #include <REGX52.H> //数组代表显示亮灯的内容0、1、2、3、4、5、…

单车模型及其线性化

文章目录 1 单车模型2 线性化3 实现效果4 参考资料 1 单车模型 这里讨论的是以后轴为中心的单车运动学模型&#xff0c;由下式表达&#xff1a; S ˙ [ x ˙ y ˙ ψ ˙ ] [ v c o s ( ψ ) v s i n ( ψ ) v t a n ( ψ ) L ] \dot S \begin{bmatrix} \dot x\\ \dot y\\ \d…

C++ : 初始化列表 类对象作为类成员

传统方式初始化 C 提供了初始化列表语法&#xff0c;用来初始化属性 初始化列表 语法&#xff1a; 构造函数()&#xff1a;属性1(值1), 属性2&#xff08;值2&#xff09;... {} class Person { public://传统方式初始化 Person(int a, int b, int c) {m_A a;m_B b;m_C c…

python之pyqt专栏6-信号与槽2

上一篇python之pyqt专栏5-信号与槽1-CSDN博客&#xff0c;我们通过信号与槽实现了点击Button&#xff0c;改变Label的文本内容。可以知道 信号是在类中定义的&#xff0c;是类的属性 槽函数是信号通过connect连接的任意成员函数&#xff0c;当信号发生时&#xff0c;执行与信号…

FFmpeg架构全面分析

一、简介 它的官网为&#xff1a;https://ffmpeg.org/&#xff0c;由Fabrice Bellard&#xff08;法国著名程序员Born in 1972&#xff09;于2000年发起创建的开源项目。该人是个牛人&#xff0c;在很多领域都有很大的贡献。 FFmpeg是多媒体领域的万能工具。只要涉及音视频领…

Selenium-Unittest单元测试框架

1、Unittest介绍 为什么要学习单元测试框架 测试用例的组织与运行需要单元测试框架的参与&#xff0c;从而满足不同测试场景的需要&#xff0c;单元测试框架提供了丰富的比较方法&#xff1a;实际结果与预期结果的对比测试结果 单元测试框架提供了丰富的日志&#xff1a;给出测…

【SQL Server Management】使用手册

目录 ⛳️【SQL Server Management】 ⛳️1. 启动登录 ⛳️2. 忘记密码 ⛳️3. 操作数据库和表 3.1 新建数据库text 3.2 新建表 3.3 编辑表 3.4 编写脚本 ⛳️【SQL Server Management】 ⛳️1. 启动登录 需要开启服务 ⛳️2. 忘记密码 登录windows--> 安全性 -->…

mycat快速搭建

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;博主会及时修改 mycat快速搭建 在主从数据库集群架构中&#xff0c;让主库负责处理写入操作&#xff0c;而从库只负责处理select查询&am…

振南技术干货集:FFT 你知道?那数字相敏检波 DPSD 呢?(1)

注解目录 1 、DPSD 的基础知识 1.1 应用模型 1.2 原理推导 1.3 硬件 PSD &#xff08;相敏检波&#xff0c;就是从繁乱复杂的信号中将我们关心的信号检出来&#xff0c;同时对相位敏感。 数学原理&#xff0c;逃不掉的&#xff0c;硬着头皮看吧。&#xff09; 2 、DPSD …

坚鹏:基于招商银行案例研究的银行APP运营成功之道培训圆满结束

中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点&#xff0c;服务个人客户超6.5亿户。2022年&#xff0c;在《银行家》…

Linux(10):Shell scripts

什么是 Shell scripts shell script&#xff08;程序化脚本&#xff09;&#xff1a;shell 部分是一个文字接口下让我们与系统沟通的一个工具接口&#xff1b;script 是脚本的意思&#xff0c;shell script 就是针对 shell 写的脚本。 shell script 是利用 shell 的功能所写的…

【ONE·Linux || 网络基础(四)】

总言 主要内容&#xff1a;传输层UDP、TCP协议基本介绍。UDP报文格式、TCP报文格式、三次握手四次挥手、TCP可靠性策略说明。 文章目录 总言8、UDP协议&#xff08;传输层一&#xff09;8.1、传输层预备知识8.1.1、端口号8.1.2、一些指令&#xff08;netstat、pidof、xargs&am…

UE4/UE5 雾

雾 UE4/UE5 雾平面雾材质效果图&#xff1a; 3D雾区材质效果图&#xff1a; UE4/UE5 雾 平面雾 做好将材质放在Plane上就行 材质 效果图&#xff1a; 3D雾区 做好将材质放在3D模型上就行 材质 效果图&#xff1a;

智能优化算法应用:基于蜉蝣算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜉蝣算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜉蝣算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜉蝣算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Android问题笔记四十九:ViewPager 嵌套 Fragment 扩大滑动响应区域,避免左右滑动过于灵敏问题

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…