进程控制--进程的等待

回顾

之前我们已经学习了进程的状态和进程的退出如果你没有这些基础知识,应先去了解进程的相关基础知识。

这次我们主要来学习如何让进程等待子进程的退出。

为什么要等待子进程?

之前我们在学习进程的状态的时候,我们知道了进程有一种状态名叫 僵尸状态(Z状态)。

这种状态是因为 子进程已经运行完了,而父进程仍然在运行,子进程不能把它的退出码(返回值)给父进程,从而导致子进程处于僵尸状态,会一直占用系统资源。

如果僵尸进程长时间存在,那必然就会导致操作系统资源被占用、泄漏。所以我们有没有什么办法去释放掉该僵尸进程呢? 

答案是有的!  使用操作系统提供的wait系统接口函数,可以检查等待并释放掉僵尸进程,并得它的退出码。 

1.wait

 因为wait是系统接口函数,所以我们是输入 man 2 wait,这个2指的是系统接口函数类。

它是被包含在头文件#include<sys/types.h> 和 #include<sys/wait.h>头文件中

我们直接来进行demo演示用法。

至于*status这个参数是什么,我们稍后再讲。

首先我们开两个窗口,一个窗口用于执行我们的代码程序,另一个代码来检测我们的进程状态

我们检测进程的状态使用 一个shell脚本指令

while :; do ps axj | head -1 && ps axj | grep myproc | grep -v grep; sleep 1; echo "########################################################";done

先来看看我们写的这个代码,使用fork创建子进程。

子进程运行5秒,然后退出。

父进程休息10s后开始等待,如果等待成功,就返回子进程的PID,并且休息10s方便我们观察进程的状态。 

 程序都开始运行,子父进程都处于S状态,为什么处于S状态看过之前的内容应该清楚。

 

 子进程运行完毕后,父进程还没运行完,子进程进入僵尸状态。

 父进程休眠10s后,开始等待子进程,并且成功等到子进程,从右边可以看到,子进程已经被释放了,父进程仍在运行!

这就是进程的等待!

2.waitpid

 他与wait 不同的地方在于他有三个参数,

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

首先是多了一个pid的参数,这个参数是指定要等待的子进程的pid,不过如果你传的pid是-1的话,他就会默认等待任意一个子进程。注意是一个!

 

第二个参数是int* status,可以发现wait也有这个参数,那么这个参数是什么呢?它是一个输出型参数,用于返回子进程的退出状态。

 

这里的输出中status的结果不是1而是256呢?

这是因为这里的status并不只是子程序的返回值,它还存储着其他东西

status是int类型的,所以他占了4个字节,不过它存储进程退出状态需要前2个字节就够了(16个比特位)。

之前我们就讲了,进程的退出有三种情况。

一种是进程运行成功,且结果正确。

一种是进程运行成功,结果不正确。

一种是进程异常终止了。

如果进程因为异常终止,通常是给进程发送了某种信号迫使进程终止。所以,进程退出状态就不仅仅是只有退出码,还有它收到了什么信号。

 

进程如果正常终止,前八个比特位是全0,次八个比特位存储着它的退出码。

进程如果异常终止,仅使用前八个比特位,并且前七个比特位存储它的终止信号,第八个比特位为core dump信号。

所以这就是为什么这就知道了刚刚的进程的status是256(0001 0000 0000)。而如果我们想分别打印出退出码和终止信号,可以用位操作符

 

也可以使用宏来完成

WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

 

 

 再来看看收到信号终止的情况

1.程序直接收到信号终止

 

 开另外一个窗口直接给子进程发送信号终止它

2.程序异常而收到信号终止

因为浮点异常终止

那么它的第三个参数options是什么呢?

它决定是否是阻塞等待,看我们之前的例子,如果一旦父进程开始等待,它就会停在那里,直到子进程退出,这就叫做阻塞等待。

 

 

 非阻塞等待

如果在options参数传入WNOHANG,就是非阻塞等待,如果子进程没有完成,父进程不必停下等子进程,可以继续运行。如果子进程完毕,再释放子进程。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot +Sa-Token优雅的实现项目鉴权!

1. 技术选型 最近在做登录、授权的功能&#xff0c;一开始考虑到的是spring boot spring security&#xff0c;但spring security太重&#xff0c;而我们是轻量级的项目&#xff0c;所以&#xff0c;spring security不适合我们。 而后考虑spring boot shiro&#xff0c;但s…

ChatGPT ✖️ 前端 = 有点er意思

HOT! HOT! HOT! &#x1f525; &#x1f525; &#x1f525; ChatGPT登上了国内各大平台的热搜榜&#xff0c;应该在去年11月末的时候就有不少同学了解并使用过&#xff0c;那个时候它刚刚问世&#xff0c;在互联网圈子里有了很大的热度&#xff0c;但是对于大众来说&#xff…

fastapi基础篇

文章目录 简介环境搭建安装基础文件自动文档 基础使用POST请求传递参数返回定制信息jinja2返回html 简介 FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 3.6 并基于标准的 Python 类型提示。 关键特性 快速&#…

「 计算机网络 」TCP的粘包拆包问题

「 计算机网络 」TCP的粘包/拆包问题 参考&鸣谢 大病初愈&#xff0c;一分钟看懂TCP粘包拆包 雷小帅 TCP 的粘包拆包以及解决方案 一乐说 文章目录 「 计算机网络 」TCP的粘包/拆包问题一、前言二、为什么UDP没有粘包三、粘包拆包发生场景四、常见的解决方案五、Netty对粘包…

内卷把同事逼成了“扫地僧”,把Git上所有面试题整理成足足24W字测试八股文

互联网大厂更多的是看重学历还是技术&#xff1f; 毫无疑问&#xff0c;是技术&#xff0c;技术水平相近的情况下&#xff0c;肯定学历高/好的会优先一点&#xff0c;这点大家肯定都理解。 说实话&#xff0c;学弟学妹们找工作难&#xff0c;作为面试官招人也难呀&#xff01…

【PCIE732】基于 Kintex UltraScale 系列FPGA 的2 路40G 光纤通道适配器(5GByte/s 带宽)/XCKU060

板卡概述 PCIE732 是一款基于PCIE 总线架构的高性能数据传输卡&#xff0c;板卡具有1 个PCIex8 主机接口、2 个QSFP40G 光纤接口&#xff0c;可以实现2路QSFP 40G 光纤的数据实时采集、传输。板卡采用Xilinx 的高性能Kintex UltraScale 系列FPGA 作为实时处理器&#xff0c;板…

9. Linux下实现简单的socket通讯

本文简单介绍了UDP传输层协议&#xff0c;并在Linux下实现简单的socket通讯 一、UDP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的传输层协议&#xff0c;它不保证数据包的可靠性和顺序。UDP在IP协议的基础上增加了简单的差错…

TCP是面向字节流的协议

TCP字节流 之所以会说 TCP 是面向字节流的协议&#xff0c;UDP 是面向报文的协议&#xff0c;是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同&#xff0c;也就是问题原因在发送方。 为什么 UDP 是面向报文的协议&#xff1f; 当用户消息通过 UDP 协议传输时&#xff0c;…

《Java 核心技术面试》课程笔记(十)

如何保证集合是线程安全的? 典型回答 Java 提供了不同层⾯的线程安全支持。 在传统集合框架内部&#xff0c;除了 Hashtable 等同步容器&#xff0c;还提供了所谓的同步包装器&#xff08;Synchronized Wrapper&#xff09;&#xff0c;我们可以调用 Collections 工具类提供…

Android java层hook------xposed框架的使用

xposed曾经是android平台上最好的java层hook和调试工具&#xff0c;由于已经不再更新&#xff0c;当前支持的android系统版本比较老旧&#xff0c;目前只能支持到android6.0&#xff0c;故已经逐渐落伍&#xff0c;目前android上最广泛使用的hook工具是frida&#xff0c;这是另…

C语言函数大全-- _w 开头的函数(5)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _wspawnl 1.1 函数说明 函数声明函数功能int _wspawnl(int mode, const wchar_t* cmdname, const wchar_t* arglist, ...);启动一个新的进程并运行指定的可执行文件 参数&#xff1a; mode &#xff1a; 启动命令的…

用爬虫分析沪深300指数超长走势

我们知道&#xff0c;一个股市里面有非常多的股票&#xff0c;我们如何能够量化整个股市整体的行情呢&#xff0c;答案是通过一些综合性的指数。本文所选用的沪深300就是这类指数中的一个。我们先来看一下百度百科对于沪深300的解释。 由于股票价格起伏无常&#xff0c; 投资者…

蓝桥杯拿到一等奖,并分享经验

昨天和群里的小伙伴在群里聊&#xff0c;有的小伙伴竟然说蓝桥杯一等奖没有含量&#xff0c;我也是醉了&#xff01; 就像去年看了一个号主写的&#xff1a;研究生遍地都是! 放眼全国14亿人口&#xff0c;别说研究生了&#xff0c;本科生占比有多少? “蓝桥杯是我人生中得到…

数慧时空20年磨一剑:推出智能遥感云平台DIEY,自然资源多模态大模型“长城”,为地理信息产业提速

作者 | 伍杏玲 出品 | CSDN 据中国地理信息产业发展报告公布的数据&#xff0c;截至2020年末&#xff0c;行业从业单位13.8万家&#xff0c;从业人数336.6万&#xff0c;到2021年末&#xff0c;从业单位增加到16.4万家&#xff0c;从业人数增加到398万&#xff0c;产业规模越…

Go colly爬虫框架精简高效【杠杠的】入门到精通

1 前言 1.1 Go Colly 爬虫介绍 爬虫框架中&#xff0c;各中流行的编程语言都有自己热门框架&#xff0c;python中的selenium、Scrapy、PySpider等&#xff0c;Java中的Nutch、Crawler4j、WebMagic、WebCollector等。golang中colly使用Go语言编写的功能强大的爬虫框架&#xf…

pdf如何删除其中一页?不妨试试这些办法

PDF格式是一种非常常见的文档格式&#xff0c;它可以在各种系统和设备上使用&#xff0c;而且无论在哪里打开&#xff0c;都可以保持格式的一致性。有时候&#xff0c;我们需要删除PDF文档中的一页&#xff0c;无论是为了更改文档的结构&#xff0c;还是为了删除错误的信息。在…

拥抱生成式大模型 --- 提示工程篇

本文为系列的第二篇&#xff0c;主要是学习和总结chatgpt类模型的提示工程。感谢吴恩达老师的开源课程。 引言 随着大型语言模型&#xff08;LLM&#xff09;的发展&#xff0c;LLM 大致可以分为两种类型&#xff0c;即基础LLM和指令微调LLM。基础LLM是基于文本训练数据&…

Python机器学习入门 - - 贝叶斯算法学习笔记

文章目录 前言一、贝叶斯算法简介二、贝叶斯算法的数学原理1. 条件概率2. 全概率公式3. 贝叶斯公式4. 朴素贝叶斯分类器5. 高斯朴素贝叶斯分类器和伯努利朴素贝叶斯分类器 三、Python实现朴素贝叶斯分类总结 前言 贝叶斯公式是我们高中就耳熟能详的统计概率定理&#xff0c;贝…

亚马逊云科技出海日6月9日盛夏盛启

向全球价值链上游奋进 中国企业增强国际竞争力的关键&#xff0c;是努力朝全球价值链上游奋进&#xff0c;发力技术出海。中国的出海新机遇&#xff0c;背后曾是疫情在全球按下数字互联和数字化升级的快进键&#xff0c;跨境电商、在线社交、移动支付、数字服务等数字经济迎来…

如何让你的 Jmeter+Ant 测试报告更具吸引力?

目录 引言 一、安装apache-Ant 二、Jmeter准备 3、生成测试报告 4、JMeter动态参数处理逻辑是什么&#xff1f; 5、JMeter是怎么做API自动化测试的&#xff1f; 结语 引言 想象一下&#xff0c;你辛苦搭建了一个复杂的网站&#xff0c;投入了大量的时间和精力进行开发和…