进程控制2——进程等待

在上一小节中我们介绍了进程的创建(fork)与退出(main函数的return与exit函数)
并且要有一个意识,进程退出的时候只有三种情况:
1.进程退出,结果正确
2.进程退出,结果不正确
3.运行异常,收到信号退出

文章目录

  • 1.进程等待
  • 2.wait/waitpid
    • 1). wait
    • 2). waitpid
  • 2.进程等待如何完成它的任务
    • 1). 进程等待解决僵尸进程内存泄漏
    • 2). 进程等待如何收到子进程退出信息?
    • 3). 从系统层面大致了解父进程获取子进程退出信息信息
  • 3.阻塞等待

现在我们还需要认识一个函数_exit函数
在这里插入图片描述
可以看到它在二号手册里,所以它是系统调用函数。它也能够终止进程。用法跟exit函数一样,那它与exit函数有什么区别呢?代码演示一下:
exit函数
在这里插入图片描述

在这里插入图片描述
_exit函数
在这里插入图片描述

在这里插入图片描述
我们发现exit函数会先刷新缓冲区的内容到屏幕上,然后再退出进程,但是
_exit函数是直接退出,没有刷新缓冲区内容,并且exit函数是标准库函数,_exit函数是系统调用函数,由此我们可以得到,exit函数是封装了_exit函数,内部还有诸如刷新缓冲区这样的其他的工作。
在这里插入图片描述
我们知道库函数,系统调用操作系统内核是这样的关系,exit函数刷新缓存区,_exit函数没有刷新缓存区,那么我们也可以得到一个结论,我们所认知的缓存区不在操作系统内部。这就是进程退出所用到的函数。

说明:虽然_exit的参数是int,但是仅有低8位可以被父进程所用。
所以_exit(-1)时,在终端执行$?发现返回值是255。

1.进程等待

当一个进程退出后没有被回收,那么它就会进入僵尸状态,并且它的父进程不回收它的话,这个进程会一直存在,会发生内存泄漏。那么进程等待的一个任务就是为了解决僵尸状态伴随的内存泄漏。
那么什么是进程等待呢?

它其实是使用wait/waitpid的方式来实现父进程对子进程资源回收的等待过程。

为什么要进程等待?上面已经说过

1.为了解决僵尸状态不回收造成的内存泄漏问题。
2.要知道子进程把任务完成的怎么样,因为什么终止,退出(退出码和接受信号),这一点不是必要的。

比如一些场景下父进程是不需要子进程把任务完成与否,子进程因为什么而退出、终止的。

2.wait/waitpid

1). wait

在这里插入图片描述
wait是一个系统调用函数,它有一个参数,我们稍后再说。它会回收任意一个子进程并会返回回收进程的id。
我们现在来展示一下任意这两个字的含义:
在这里插入图片描述
我们这里创建了五个子进程,所以掉用五次wait。
在这里插入图片描述
可以看到操作系统调度进程是不确定的,wait回收进程也是不确定的。

2). waitpid

在这里插入图片描述
waitpid可以看到有三个参数,第二个参数和第三个参数也先不说,那么显然它是专门回收特定进程的,当它的参数是下面红框中的那样的时候,它和wait没有区别,当waitpid第一个参数小于零的时候,它也是回收任意一个子进程。
在这里插入图片描述

在这里插入图片描述

2.进程等待如何完成它的任务

1). 进程等待解决僵尸进程内存泄漏

我们先搞出一个僵尸进程:
在这里插入图片描述

然后使用wait回收这个进程:
在这里插入图片描述

在这里插入图片描述

2). 进程等待如何收到子进程退出信息?

这就谈论到wait和waitpid中的int* status这个参数了。我们用C语言做题的时候,也会碰到这样的接口:
在这里插入图片描述
这种叫做输出型参数,目的是调用这个接口带回来某些东西,而这里的status带回来的就是退出码和子进程异常终止收到的信号。
话不多说代码展示:
这里退出码是0:
在这里插入图片描述

在这里插入图片描述
退出码为10:
在这里插入图片描述

在这里插入图片描述
我们看到我们的退出码是10,但是打印出来的是2560。
我们再用一个11号信号来终止子进程:
在这里插入图片描述

在这里插入图片描述
发现status的值又是10。
我们说了,这个变量可以接收到退出码和异常终止的信号,而这两个是两个东西,所以我们的status不是一个单纯的int变量,而是一个32个比特位的二进制数字,而我们也只用它的低十六位:
在这里插入图片描述
那我们现在,来验证一下是否真的是我说的这样呢,我们只需要对status进行位运算就可以:
在这里插入图片描述

在这里插入图片描述
确实是我们说的那样。那么说明wait/waitpid确实可以接收退出码和终止信号。
那我们可以这样写:
在这里插入图片描述
在这里插入图片描述
但是这里介绍两个宏:
在这里插入图片描述
WIFEXITED(status) 若此值为非0 表明进程正常结束。 若上宏为真,此时可WEXITSTATUS(status)获取进程退出状态。

3). 从系统层面大致了解父进程获取子进程退出信息信息

我们知道进程间具有独立性,所以我们无法通过一个简单的变量来获取子进程的退出信息(因为同一个变量,但凡有一个进程改变它的值,都会发生写时拷贝),所以需要系统调用来实现。
子进程在退出的时候会把代码数据销毁之后,将退出信息写到自己的pcb结构体中并将状态改为Z,然后等待父进程回收,而父进程使用wait/waitpid回收后,才可以释放子进程pcb。
在这里插入图片描述

3.阻塞等待

我们前面的的代码都是父进程等到子进程结束后,再开始回收子进程,那直接回收呢?
在这里插入图片描述
在这里插入图片描述
我们看到,父进程回收的时候是一直在等待子进程结束之后才进行的回收,才会执行后续的代码,这就是阻塞等待。这就涉及到waitpid的第三个参数:
当这个参数值为0时,就是阻塞等待。
当这个参数为WNOHANG(一个#define的常量)时,是非阻塞等待:
在这里插入图片描述
在这里插入图片描述

在这里我们发现它返回了一个值是0,但是应该是子进程的id才对,这里返回值有了不一样的解释:

返回值大于0:等待成功
返回值等于0:等待成功,但是子进程还没有结束
返回值小于0:等待失败(例如等待一个不存在的进程)

所以当我们使用非阻塞等待时需要以一个循环的方式多次等待,而我们也可以再这个循环里做一些父进程比较简单的任务。

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

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

相关文章

详细创建Prism架构wpf项目

方案一&#xff1a; 1.创建一个普通wpf项目 2、安装NuGet包&#xff1a;Prism.DryIoc 3、App.xaml.cs中: 将原本的父类Application改为&#xff1a;PrismApplication&#xff0c;并且实现抽象类 CreateShell方法中写上&#xff1a;”return Container.Resolve<MainWindow>…

2010年5月27日Go生态洞察:I/O中Go的热门问答

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【教程】多进程下载百度旋转验证码图片-制作数据集

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 效果展示&#xff1a; 直接上代码&#xff0c;开箱即用&#xff08;当然selenium库自己装一下&#xff09;&#xff1a; import os import time import requests from selenium import webdriver from selenium.…

基于Skywalking的全链路跟踪实现

在前文“分布式应用全链路跟踪实现”中介绍了分布式应用全链路跟踪的几种实现方法&#xff0c;本文将重点介绍基于Skywalking的全链路实现&#xff0c;包括Skywalking的整体架构和基本概念原理、Skywalking环境部署、SpringBoot和Python集成Skywalking监控实现等。 1、Skywalki…

用中文编程工具编写的代码实现如图所示效果,请分享一下用你所学的编程语言写下这个代码,大家一起交流学习

用中文编程工具编写的代码实现如图所示效果&#xff0c;请分享一下用你所学的编程语言写下这个代码&#xff0c;大家一起交流学习 编程要求如图&#xff1a;在输入框里输入行数&#xff0c;随便输入多少&#xff0c;点击按钮&#xff0c;即刻显示如图所示效果&#xff0c;下一…

《009.Springboot+vue之进销存管理系统》

《009.Springbootvue之进销存管理系统》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisredis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 1.用户管…

什么是MES管理系统生产建模

随着科技的飞速发展&#xff0c;智能制造已成为制造业的新常态。MES生产管理系统作为支撑智能制造的核心技术之一&#xff0c;在推动制造业转型升级中发挥着至关重要的作用。而MES管理系统生产建模&#xff0c;作为MES管理系统的关键环节&#xff0c;对于实现数字化、智能化的生…

电脑风扇控制软件 Macs Fan Control Pro mac中文版功能介绍

Macs Fan Control mac是一款专门为 Mac 用户设计的软件&#xff0c;它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度&#xff0c;以提高设备的散热效果&#xff0c;减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温…

C#解析XML并反序列化为Model的方法

虽然现在json大行其道&#xff0c;但是xml格式依旧占据着广阔的编程世界&#xff0c;不管光伏锂电激光卫星汽车等等工业领域&#xff0c;基本上都是以xml为主&#xff0c;广大的.NET开发人员有很多被xml折磨的都要转java了&#xff0c;这篇小作文就来玩一种迅速完成xml到model的…

rancher或者其他容器平台使用非root用户启动jar

场景&#xff1a; java程序打成镜像&#xff0c;在rancher上运行&#xff0c;默认是root账户&#xff0c;发现hdfs或者hive不允许root账户操作&#xff1b;所以打算用费root账户启动jar&#xff0c;使其具有hive和hdfs的操作权限。 Dockerfile entrypoint.sh 思路就是上面这样…

【Spring】@Component组件

大前提&#xff1a; 添加了相关的约束文件以及注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:…

LibreOJ - 2874 历史研究 (回滚莫队)

回滚莫队就是在基础莫队的前提下&#xff0c;用更多的增加操作代替了减操作。 分成两种情况 1、一个询问的整个区间都在一个块儿里&#xff1b;这种情况直接暴力求即可&#xff0c;因为在一个块儿里&#xff0c;时间复杂度不会高。 2、一个询问的整个区间不在一个块儿里&#…

有效降低数据库存储成本方案与实践 | 京东云技术团队

背景 随着平台的不断壮大&#xff0c;业务的不断发展&#xff0c;后端系统的数据量、存储所使用的硬件成本也逐年递增。从发展的眼光看&#xff0c;业务与系统要想健康的发展&#xff0c;成本增加的问题必须重视起来。目前业界普遍认同开源节流大方向&#xff0c;很多企业部门…

汽车驾驶智能座舱太阳光模拟器老化试验

一、太阳光模拟器老化试验目的 太阳光模拟器氙光灯老化试验是一种常用的材料老化测试方法&#xff0c;通过模拟自然光照条件下的老化过程&#xff0c;评估材料的耐光性能和耐候性能其主要目的有: 1.评估材料在长时间暴露于自然光照条件下的耐久性能: 2.比较不同材料的耐光性…

vue使用websocket与springboot通信

WebSocket是HTML5下一种新的协议&#xff0c;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的 在很多项目中&#xff0c;都要用到websocket&#xff0c;使得前端页面与后端页进行实时通信&#xff0c;例如&#xff0c;实时查询…

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…

使用Ruby编写通用爬虫程序

目录 一、引言 二、环境准备 三、爬虫程序设计 1. 抓取网页内容 2. 解析HTML内容 3. 提取特定信息 4. 数据存储 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法&#xff0c;遍历网页并提取所需的信息。使用Rub…

自动驾驶算法(八):基于概率图算法的路径规划--以PRM为例以及路径规划算法总结

目录 1 概率路线算法简介 2 代码解析 3 路径规划算法总结 1 概率路线算法简介 它属于采样算法里面的一类。主要步骤分为两步&#xff1a; 1.构建概率路线图 (1)随机采样点 (2)将新采样点和距离小于阈值的 采样点连接产生图 2.在图上寻找路径 (1)Dijkstra算法…

大数据中经常使用的指令:

1、Hadoop&#xff1a; 1、关闭Hadoop集群的安全模式&#xff1a; hdfs dfsadmin -safemode leave#查看集群的模式的状态&#xff1a; hdfs dfsadmin -safemode get 2、启动、关闭Hadoop集群&#xff1a; start-all.sh stop-all.sh 3、停止yarn中进程的命令&#xff1a; yar…

游戏中的-雪花算法

1、什么是雪花算法&#xff1f; 雪花算法&#xff08;Snowflake&#xff09;是一种生成唯一ID的算法。在游戏开发过程中会为玩家生成唯一的id&#xff0c;或者玩家获得一件装备&#xff0c;为这件装备生成唯一的Id&#xff0c;将此角色和装备的Id保存于数据库当中。 全局唯一性…