进程等待讲解

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

正文开始!


进程等待的引进

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

什么是进程等待!

进程等待:

进程等待就是通过系统调用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.mzph.cn/news/174522.shtml

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

相关文章

【中间件】配置中心中间件intro

中间件middleware 内容管理 why use 配置中心配置中心feature配置中心develop主流配置中心Apollo浅谈 本文从理论上介绍一下服务化中服务治理系统中的配置中心的理论并浅析Apllo 配置在生产中是很关键的一个部分,cfeng在work中遇到几次配置问题引发的问题&#xff0…

计算机基础知识59

MySQL的卸载流程 1、先停止MySQL服务:右键“此电脑”,选择“管理”,之后选择“服务和应用程序”--“服务”,在服务中找到“MySQL”,右键选择“停止”。 2、找到“控制面板”--“程序和功能”,找到MySQL&…

android项目之调用webview

目标 在Android项目中&#xff0c;经常需要使用WebView组件来展示网页或加载HTML内容 步骤 1. 在布局文件中添加WebView组件&#xff1a; <WebView android:id"id/webview" android:layout_width"match_parent" android:layout_height"mat…

springboot接入Spring State Machine实现状态机

描述 在 Spring Boot 中实现状态机&#xff0c;通常使用 Spring State Machine 框架进行实现。该框架可以帮助我们定义、创建和管理复杂的状态机。 接下来给出一个demo&#xff0c;说明如何使用 Spring State Machine 框架实现状态机。 假设我们需要实现一个简单的订单状态机&a…

SocialFi 和 GameFi 的碰撞 — Socrates 构建新的 Web3 流量入口

伴随着比特币现货 ETF 即将通过 SEC 批准的消息&#xff0c;整个加密市场在11月份达到了熊市以来的新高峰。市场普遍上涨&#xff0c;新的玩法和项目不断涌出吸引了大量老用户回归以及新用户加入。加密市场经过长期的低迷&#xff0c;终于来到了牛市的起点&#xff01; 上一轮牛…

Selenium 连接到现有的 Firefox 示例

当前环境&#xff1a; python 3.7 selenium 3.14.1 urllib3 1.26.8 Frefox 115.1.0esr(32位) geckodriver.exe 0.33.0 1 下载 Firefox 浏览器&#xff0c;根据自己的需要选择。 下载 Firefox 浏览器&#xff0c;这里有简体中文及其他 90 多种语言版本…

什么是依赖倒置原则

1、什么是依赖倒置原则 依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;是指高层模块不应该依赖于低层模块&#xff0c;它们都应该依赖于抽象。换句话说&#xff0c;具体类之间的依赖关系应该尽可能减少&#xff0c;而抽象类或接口之间的…

C语言自定义函数的整数处理

1.输入10个整数&#xff0c;将其中最小的数与第一个数对换&#xff0c;把最大的数与最后一个数对换。写三个函数&#xff1b; ①输入10个数&#xff1b;②进行处理&#xff1b;③输出10个数。 示例输入&#xff1a; 2 1 3 4 5 6 7 8 10 9 示例输出&#xff1a; 1 2 3 4 5 6…

Python交互式解释器及用法

为了让开发者能快速学习、测试 Python 的各种功能&#xff0c;Python 提供的“python”命令不仅能用于运行 Python 程序&#xff0c;也可作为一个交互式解释器一一开发者逐行输入 Python 代码&#xff0c;它逐行解释执行。 当输入“python”命令时&#xff0c;可以看到如下输出…

带你用uniapp从零开发一个仿小米商场_10. 首页开发

图标菜单栏开发 轮播图开发完成后,就是图标菜单栏了 可以看出这些图标都是一样的样式,所以可以勇哥flex布局让他们每个占百分之20 代码如下,既然都是一样的那就直接用个循环嵌套一下 data数据如下 同样,为了能让这段代码能在别的地方也用到,我直接把它封装成组件 <templ…

Spring 注解

Spring部分 声明bean的注解 Component: 组件&#xff0c;没有明确的角色在这里插入代码片Service: 在业务逻辑层使用&#xff08;service层&#xff09;Repository: 在数据访问层使用&#xff08;dao层&#xff09;Controller: 在展现层使用&#xff0c;控制器的声明&#xff0…

ClickHouse:真正的OLAP列式DBMS

ClickHouse 1、本文持续更新... 1、本文持续更新… ClickHouse官方文档&#xff1a;https://clickhouse.com/docs/zh

Go 基本数据类型

一、内置类型 1、值类型&#xff1a; bool int(32 or 64),int8,int16,int32,int64 uint(32 or 64),uint8(byte),uint16,uint32,uint64 float32,float64 string complex64,complex128 array //固定长度的数组2、引用类型&#xff1a;&#xff08;指针类型&#xff09; sli…

【Element】el-switch开关 点击弹窗确认框时状态先改变----点击弹窗取消框失效

一、背景 需求&#xff1a;在列表中添加定期出账的开关按钮&#xff0c;点击开关时&#xff0c;原来的状态不改变&#xff0c;弹出弹窗&#xff1b;点击弹窗取消按钮&#xff1a;状态不改变&#xff0c;点击弹窗确定按钮&#xff1a;状态改变&#xff0c;并调取列表数据刷新页…

LINUX入门篇【10】---进程篇【2】---进程状态

前言&#xff1a; 有了上一篇关于进程的初步认识和我们的PCB第一个数据段–标识符的讲解&#xff0c;接下来我们将继续讲解PCB的其他数据段&#xff0c;本篇要讲的是进程状态。 进程状态&#xff1a; 就像我们写贪吃蛇的时候&#xff0c;构建的游戏状态来判定游戏结束的方式…

vue实现对话框指定某个对话内容的滚动到指定位置(滚动到可视区域的中间位置)

1、使用el-scrollbar实现定位滚动&#xff08;elementui组件库&#xff09; 如何滚动&#xff1a;参考链接 比如说指定某条对话内容滚动到可视区域的中间 html结构&#xff1a; <div class"chat-list" id"chat-list"><el-scrollbar ref"scro…

代码随想录算法训练营第六十天|84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释…

C--51--WiFi模块ESP-01S ( 路由服务器 )

ESP-01S当成服务器&#xff1a; 1、接线 &#xff08;接CH340接入pc&#xff09; USB转TTL插入电脑&#xff0c;TX/RX交叉接线&#xff0c;VCC接5V&#xff0c;GND接地 查询IP地址&#xff1a;ATCIFSR 2、建立AT指令使能连接 一、配置网络调试助手 协议类型&#xff1a;TCP C…

Linux——使用命令查看文件和文件夹数量

目录 一、相关命令参数解析二、查看当前目录下的文件数量2.1 包含子目录中的文件2.2 不包含子目录中的目录 三、查看当前目录下的文件夹个数3.1 不包含目录中的目录3.2 包含目录中的目录 四、查看当前文件夹下叫某某的文件的数量实例 五、总结 一、相关命令参数解析 "&qu…

java方法引用

MethodReference 前言特定类任意方法引用函数接口特定类调用 前言 JDK1.8之后提供是Lambda&#xff0c;它可以让开发者自定义函数接口中抽象方法的实现&#xff0c;方法引用可以让开发者直接引用已存在的方法。 方法引用的形式: 类::静态方法 类::特定类任意方法 对象::实例方…