linux进程控制——进程等待——wait、waitpid

news2024/11/13 23:36:09

        前言:本节内容仍然是进程的控制,上一节博主讲解的是进程控制里面的进程创建、进程退出、终止。本节内容将讲到进程的等待——等待是为了能够将子进程的资源回收,是父进程等待子进程。 我们前面的章节也提到过等待, 那里的等待是进程等待硬件设备, 而这里是进程等待软件设备,也就是说——进程等待可以发生在硬件上面, 也可以发生在软件上面。 另外, 通过本节的学习, 友友们可以理解一个完整的进程控制是什么样的, 是怎么样的流程。 

        ps:本节内容适合学习了进程创建、退出与终止的友友们观看

为什么要有进程等待

        进程等待, 对于一个子进程来说, 如果子进程退出, 父进程不管不顾, 就可能造成僵尸进程的问题。 进而造成内存泄漏!!!

        进程等待的一个原因就是为了子进程能够在僵尸进程的时候被父进程回收, 防止内存泄漏。 ——僵尸进程无法被杀死,需要父进程等待来杀掉它, 从而解决内存泄漏问题。 

        第二个原因就是我们要通过进程等待获取子进程的退出情况。——知道我布置给子进程的任务, 它完成的怎么样了? ——要么关心, 要么不关心这个是可以选择的。

进程的等待是什么?

        进程等待就是通过系统调用, wait/waitpid, 来进行对子进程进行状态检测与回收的功能!

进程等待是怎么实现的?

        进程等待是如何实现的用一句话来说就是——父进程通过调用wait/waitpid进行僵尸进程的回收问题!               

        但是, 这里就有问题, wait接口和waitpid接口是什么? 这就是我们本篇文章着重讲解的知识点。 现在我们先来看一下man手册:

        wait是一个系统调用接口, 包含在sys/types.h头文件里。 定义就可以见上图, 然后里面的status参数暂时可以不考虑。

        wait和waitpid的作用就是等待一个进程, 当这个进程退出后, 那么父进程就可以等待子进程

 , 回收子进程的资源。 

wait和waitpid的返回值

返回值如果是大于零的, 那么就是等待成功, 并且是被等待的子进程的pid。

单进程等待

下面是实验(使用wait, waitpid和wait一样, 不用着急, waitpid后续会讲解)

        上面的代码就是先创建一个子进程, 然后子进程5s后变成僵尸进程被等待, 父进程10后运行等待, 然后关闭子进程。 但是这个程序很难观察到wait的作用,我们修改一下:

        将上图板块中的代码改成图中所示的样子。 然后运行程序, 我们就可以观察到:

多进程等待

上面是单进程的情况, 那么多个子进程的时候, wait等待的是哪一个进程呢? ——wait一次是等待一个进程, 是随机的。 而且只等待一个进程, 那么现在我们来试验一下,下面是代码:

我们运行后, 可以观察到, 5s后, 最后一个创建的子进程都已经是僵尸进程了。

然后随即等待, 全部等待成功后我们就会发现, 进程被回收了。 

 

阻塞等待 

那么我们现在思考一下, 当子进程没有变成僵尸, 一直在运行的时候, 父进程等待还有用吗?

现在看下面一个实验, 这里面创建了一个子进程, 这个子进程会无限次循环下去, 但是父进程会在10s后进入等待, 观察现象:

运行结果如下,可以发现, 其实子进程没有进入僵尸, 那么父进程的等待对不它不起效果。——这个其实就是父进程在wait这里发生了阻塞等待!!也就是说, 父进程不会退出, 一直等待子进程的返回。

        那么, 什么是阻塞等待——阻塞等待就是子进程不退出, 父进程默认在wait的时候, 也就是调用这个系统调用的时候, 不发生返回, 这个就叫做阻塞等待。

        知道了阻塞等待之后, 我们也知道, 任何进程都会变成僵尸进程, 然后被进程等待回收资源, 等待是必须的。 僵尸进程是必须的。——知道了这些, 我们就可以想到一个完整的进程控制代码就是:有创建(fork), 有终止(exit), 有等待(wait)。

waitpid

        现在我们来说一下waitpid。 waitpid的功能多于wait, wait是waitpid的子集。 

waitpid的第一个参数是等待的进程的pid(也就是说可以指定等待对象), 也可以传送-1, 表示随即等待和wait一样。 并且waitpid的返回值是等待的进程的pid。

        退出信息:

        退出信息是通过第二个参数, status获取到。 ——wait里面是第一个参数。 

        对于status, 这个动能可以使用可以不使用——也就是说可以传参, 也可以不传参。 status是一个指针, 意思是说将函数内部的数据通过status带出来, 也就是输出型参数。 

        并且这个int是被当做及部分使用的。 ——因为int有32给比特位, 其中八个或者十六个比特位表示一个东西, 另外又表示一个东西, 这里我们进行试验一下:

        首先我们要写或者退出结果必须顶一个整数变量, 然后取地址变量传给waitpid, 调用系统嗲用后获取相应的结果, 再带出这个结果, 然后status就会发生变化。

运行结果如下:

        这里之所以退出2816, 就要考虑几个问题:

        我们知道, 进程推出的时候, 主要有三种场景——退出结果正确, 推出结果不正确, 异常。 那么, 子进程退出, 父进程希望获取什么信息呢?

        首先:1、子进程代码是否异常?——不同信号表示不同异常

                   2、没有异常, 结果对吗? exitcode, 不对是因为什么呢? ——不同退出码表示不同原因

        那么, status最少能够获取这个进程是否发生了异常, 异常原因, 结果是否正确? 为什么?——这些信息都保存在了status的低16比特位, 并且这里我们只谈status的低16位。

        这里的低7位就是代表进程的终止信号, 如果进程异常退出, 这里会保存下来什么异常——比如除零错误, kill -9等等。

        这里的第八位是core dam标志——这个暂时不谈。

        前八位就是代表正常退出的状态。

        而我们的子进程上面是可以看到是正常退出——信号位0; 并且退出码为11, 二进制就是1011, 然后合起来就是0000 1011 0000 0000——这个二进制转化为十进制就是2816.

         现在我们来谈一下信号:

        我们就会发现, 这些信号里面没有0号信号——没有零号信号, 那么这个时候我们是不是就可以通过这个进程是否是零号信号, 来判断是否发生了异常? 

        一旦进程发生异常, 那么不同信号就会代表不同的异常, status就会待会不同的结果。

现在, 我们来考虑——父进程要拿到子进程状态数据, 为什么要调用wait等待系统调用呢? 直接用全局变量不行码?——答案是不可以, 我们知道, 父子进程是独立的, 如果在子进程里修改了这个全局变量, 本质上就是发生了写时拷贝, 父进程里面的全局变量并不会被修改。 所以不可以。

        现在我们想要将子进程的状态分开打印——打印信号和退出码, 怎么打印呢?

        下面是一个代码:

程序和上面一样, 但是打印的内容:

 那么我们给一个除零错误, 就会看到:

我们使用kill -9就可以看到:

非阻塞轮询

以上就是本节的全部内容, 下面是本节笔记:

 

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

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

相关文章

《C++基础入门与实战进阶》专栏介绍

🚀 前言 本文是《C基础入门与实战进阶》专栏的说明贴(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)。 专栏介绍:以多年的开发实战为基础,总结并讲解一些的C/C基础与项目实战进阶内…

在MySQL中COUNT(*)、COUNT(列)和COUNT(DISTINCT 列)有什么区别

本文还发布在我的 medium 和 掘金 上 这篇文章让我们看看MySQL中count(*)和count(column_name)有什么区别。也许你知道它们都是计算结果行数的,那么在使用的时候如何选择呢。 我在MySQL库中创建了一个t_hero表 CREATE TABLE t_hero (id int NOT NULL,name char(10)…

软件测试——用例篇(上)

概念 什么是测试⽤例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素 设计测试⽤例原则⼀: 测试⽤例中⼀个必需部分是对…

AI-WEB-1.0 靶机

AI-WEB-1.0 一、安装靶机环境 下载地址: https://www.vulnhub.com/entry/ai-web-1,353/ 下载压缩文件打开 开启虚拟机 二、信息收集 1.查看NAT模式IP段 编辑–>虚拟网络编辑器 御剑2014查IP 找到ip之后就访问网站 用扫描目录的工具扫描当前网站的目录 访问…

复制知乎文字内容

复制知乎文字内容 以edge浏览器为例: 以edge浏览器为例: 先点击F12(也就是鼠标右键->检查)再点击F1选择禁用Javascript 之后知乎的文字就可以正常复制了。 (注意:退出浏览器的时候记得把这一条恢复过…

XAML 热重载应用程序

XAML 热重载(Hot Reload)是一个在开发过程中提高效率的功能,它允许开发者在应用程序运行时修改 XAML 代码,而不需要重新启动应用程序。这个功能非常适合于调试和即时预览 UI 更改。以下是如何在应用程序中使用 XAML 热重载的一些基…

CVE-2022-21663: WordPress <5.8.3 版本对象注入漏洞深入分析

引言 在网络安全领域,技术的研究与讨论是不断进步的动力。本文针对WordPress的一个对象注入漏洞进行分析,旨在分享技术细节并提醒安全的重要性。特别强调:本文内容仅限技术研究,严禁用于非法目的。 漏洞背景 继WordPress CVE-2…

系统设计中15 个最重要的权衡

系统设计的第一法则:一切都与权衡有关。 在设计系统时,我们需要决定要包含哪些功能以及要忽略哪些功能。每次我们做这个决定时,我们都在进行权衡。在本文中,我们将探讨系统设计中遇到的15个最常见的权衡问题,并使用实…

第十四天学习笔记2024.7.25

Git安装 1.安装git 2.创建git仓库 3.创建文件并且提交文件 (git add . 将文件提交到缓存)(git commit -m 说明)(git log 查看历史) 4.分支创建与解决分支冲突问题 创建主机(git 192.1…

手机三要素接口怎么对接呢?(二)

一、什么是手机三要素? 手机三要素又叫运营商三要素,运营商实名认证,运营商实名核验,手机三要素实名验证,手机三要素实名核验,每个人的称呼都不同,但是入参和出参是一样的。 输入姓名、身份证…

24暑假算法刷题 | Day25 | 回溯算法 III | LeetCode 491. 非递减子序列,46. 全排列,47. 全排列 II

目录 491. 非递减子序列题目描述题解 46. 全排列题目描述题解 47. 全排列 II题目描述题解 491. 非递减子序列 点此跳转题目链接 题目描述 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任…

MELLE: Autoregressive Speech Synthesis without Vector Quantization

2024.7MICROSOFT 文章目录 MELLE: Autoregressive Speech Synthesis without Vector Quantizationabstractmethod损失函数 Autoregressive Image Generation without Vector Quantizationabstractmethods更好的AR modelresults MELLE: Autoregressive Speech Synthesis without…

UI框架与MVC模式详解(3)——MVC\MVP\MVVM

【PDI模式】 前文中,我们详细讲解了为实现一个涉及UI的功能所必须得三者,简称PDI: Panel类:主要实现交互逻辑、显示逻辑的地方以及保存界面相关的数据的地方Data类:数据管理类,主要是业务相关的数据Inter…

小白也能轻松学的计算机网络零基础入门(附学习路线 + 计算机网络教程)

本文作者:程序员鱼皮 免费编程学习 - 编程导航网:https://www.code-nav.cn 介绍 计算机网络是指将地理位置不同的多台计算机或设备通过通信线路进行连接,从而实现信息传递和资源共享,或者组成一个更完整的计算机系统。 如今&…

【MySQL】用户管理连接池原理{数据库权限/连接池/mysql访问逻辑}

文章目录 1.普通用户的引入用户创建用户删除用户修改用户密码 2.数据库的权限给用户授权回收权限实操过程 3.简略介绍mysql连接池3.一个用户注册/登录/使用网页版mysql逻辑 1.普通用户的引入 用户 MySQL中的用户,都存储在系统数据库mysql的user表中 mysql> use…

Internet Download Manager(IDM)2024最新免费版电脑下载管理器

1. Internet Download Manager(IDM)是一款流行的下载管理软件,以其高速、稳定的下载性能著称。 2. IDM支持多线程下载,可以显著提高下载速度。 3. 该软件还具备恢复中断下载的功能,对于网络不稳定的用户非常实用。 …

蓝鹏测径仪非标定制订制流程

测径仪通常属于非标定制设备,非标定制意味着这些设备不是按照标准规格批量生产的,而是根据特定的客户需求和应用场景设计和制造的。例如,某些测径仪可能需要特殊的测量范围、精度、传感器或软件来满足特定的工业检测要求。 测径仪非标定制的…

Axure Web端元件库:构建高效互动网页的基石

在快速迭代的互联网时代,Web设计与开发不仅追求视觉上的美感,更注重用户体验的流畅与功能的强大。Axure RP,作为一款专业的原型设计工具,凭借其强大的交互设计能力和丰富的元件库,成为了众多UI/UX设计师、产品经理及前…

箱型图大揭秘!Matplotlib带你玩转数据界的‘变形金刚’

想要一窥数据深海的秘密?Matplotlib箱型图来助阵!不是魔术师,却能让数据‘箱’中显真章,异常值无所遁形。笑点低?不,是数据洞察力强!跟着这波操作,让数据可视化变得既科学又有趣&…

【手撕数据结构】链表面试题进阶

目录 相交链表环形链表扩展问题 环形链表||原理 随机链表的复制 相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 思…