Linux 僵死进程

news2025/1/23 9:17:12

fork复制进程之后,会产生一个进程叫做子进程,被复制的进程就是父进程。不管父进程先结束,还是子进程先结束,对另外一个进程完全没有影响,父进程和子进程是两个不同的进程。

一、孤儿进程

现在有以下代码:

在这里插入图片描述

【注意】
上述代码中,调用getpid()输出当前进程的pid,调用getppid()输出当前进程的父进程的pid。

让子进程执行7次,父进程执行3次,编译并运行,结果如下:

在这里插入图片描述

分析:当父进程执行完3次之后,子进程的父进程结束,子进程就变为了孤儿进程,孤儿进程会被系统中的inti(pid=1)收养,但是在目前有些系统中,也会被随机的其他进程收养。例如,上图中,父进程执行完3次之后,父进程结束,子进程就变为了孤儿进程,该孤儿进程的父进程的id就变成了1145,说明该孤儿进程的父进程变为了pid为1145的一个进程。

二、僵死进程

僵死进程:子进程先与父进程结束,父进程没有获取子进程的退出码,子进程就变成了僵死进程。

有以下代码:

在这里插入图片描述

编译以上代码,并在后台运行,运行的时候通过ps查看进程信息,结果如下:

在这里插入图片描述

分析:

由结果可以看出当子进程结束之后,通过ps查看进程信息的时候还是可以看到子进程的信息,只不过子进程后边加了一个注释<defunct>,表示该子进程变成了僵死进程,僵死进程就是表示代码已经结束了,是已经结束的进程,这个进程在以后再也不会执行了。按道理子进程在结束了之后不应该还能看到这个进程,也就是说这个子进程本来应该已经死掉了,但是我们还能看到它,这是不合理的。

我们之所以还能看到这个子进程(僵死进程),是因为子进程比父进程先结束,父进程没有获取子进程的退出码,该子进程就变成了僵死进程。

所谓退出码是存放到PCB中的,当子进程结束之后如果父进程没有获取子进程的退出码,那么子进程的PCB就不会消失,会一直存在,所以在子进程结束之后再查看进程信息的时候就还能看到子进程的信息,但是这个子进程已经是僵死进程了。如果一个进程不断产生子进程,子进程结束后也没有获取子进程的退出码,那么这些子进程就会变成僵死进程僵死进程就会越来越多,那么内核空间的内存就会被逐渐耗光,而且僵死进程会占用着PID不释放,那么这个PID就无法被复用,软件层面的资源也被占着。

三、处理僵死进程

父进程获取子进程的退出码,僵死进程就会消失。这一步要通过父进程调用wait()来完成。wait()可以获取子进程的退出码,处理僵死进程。

代码如下:

在这里插入图片描述

运行结果如下:

①在前台运行:

在这里插入图片描述
根据运行结果可以看出,一开始只有子进程在执行,因为父进程中执行了wait,子进程执行的时候由于wait阻塞住了父进程,子进程执行结束之后,父进程才开始执行,也就是说父进程在等待子进程结束。

代码中可以看到无论父进程还是子进程退出码的值都为3,但是运行结果中val的值并不是3,而是768,这是因为int型变量占4个字节,将3换算为二进制数之后为11,这个11并不会存在第一个字节的起始位置,而是会在4个字节中的任意位置。如下图所示,把768转换为二进制数为0011 0000 0000:

在这里插入图片描述

将val的值向右移动8个位,将代码中的printf("val=%d\n",val);改为printf("val=%d\n",val>>8);之后,再编译运行,val的值的结果就是3了,如下图所示:

在这里插入图片描述

②在后台运行

运行结果:

在这里插入图片描述

作为父进程要关注有自己产生的子进程,不能让它们变为僵死进程。

如果父进程比子进程先结束,父进程没有通过wait处理结束的子进程,子进程变为了僵死进程,等到父进程结束以后,此时不管子进程活着还是死掉了,就会给子进程重新找一个父进程,让这个另外的进程来收养子进程,另外的进程来收养子进程的意义就在于这个收养子进程的父进程就会接管这个子进程,然后执行wait获取该子进程的退出码,那么即便收养的子进程已经结束变成了僵死进程,通过收养它的父进程来执行wait,这个僵死进程就消失了。

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

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

相关文章

【Vue-Router】路由元信息

路由元信息&#xff08;Route Meta Information&#xff09;是在路由配置中为每个路由定义的一组自定义数据。这些数据可以包含任何你希望在路由中传递和使用的信息&#xff0c;比如权限、页面标题、布局设置等。Vue Router 允许你在路由配置中定义元信息&#xff0c;然后在组件…

国产32位单片机XL32F001,带1 路 12bit ADC,I2C、SPI、USART 等外设

XL32F001 系列单片机采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围的 MCU。嵌入 24KbytesFlash 和 3Kbytes SRAM 存储器&#xff0c;最高工作频率 24MHz。包含多种不同封装类型多款产品。芯片集成 I2C、SPI、USART 等通讯外设&#xff0c;1 路 12bit ADC&am…

【校招VIP】测试方案之测试用例分析

考点介绍 测试用例是测试岗面试和工作后的核心&#xff0c;在面试里对测试用例的分析是高频考查点。但是很多同学因为没有真实的商业产品需求&#xff0c;只能简单的看别人的用例学习&#xff0c;导致面试时被一个陌生问题卡住。 比如最简单的用户名密码输入&#xff0c;在商业…

2023年网络安全比赛--综合渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23); 2.扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4); 3.靶机网站存在目录遍历漏洞,请将…

数据库--SQL关键字的执行顺序

一条sql语句通常包括&#xff1a; select from join where group by having order by 聚合函数 limit top 浅谈执行顺序&#xff1a; 1&#xff09;、首先确定一点&#xff0c;并不是按照我们写的语句顺序&#xff0c;从左—>右执行的 2&#xff09;、…

JVM——分代收集理论和垃圾回收算法

一、分代收集理论 1、三个假说 弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 强分代假说&#xff1a;熬过越多次垃圾收集过程的对象越难以消亡。 这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则&#xff1a;收集器应该将Java堆划分出不同的区域&…

R语言实现免疫浸润分析(1)

免疫浸润分析是生物信息学研究中的一项关键内容&#xff0c;它旨在评估肿瘤微环境中不同类型的免疫细胞组成。免疫细胞在肿瘤发展和治疗中起着至关重要的作用&#xff0c;因为它们可以影响肿瘤的生长、扩散和对治疗的响应。 为了了解免疫细胞在肿瘤中的分布和数量&#xff0c;…

【潮州饶平】联想 IBM x3850 x6 io主板故障 服务器维修

哈喽 最近比较忙也好久没有更新服务器维修案例了&#xff0c;这次分享一例潮州市饶平县某企业工厂一台IBM System x3850 x6服务器亮黄灯告警且无法正常开机的服务器故障问题。潮州饶平ibm服务器维修IO主板故障问题 故障如下图所示&#xff1a; 故障服务器型号&#xff1a;IBM 或…

客达天下项目案例

本资料转载于传智播客https://www.itheima.com/ https://space.bilibili.com/3493265607232348 黑马程序员主办的全日制统招大学——大同互联网职业技术学院 预计2024年开始招生&#xff0c;敬请持续关注&#xff01; B站视频入口&#xff1a;002_接口项目介绍_哔哩哔哩_bili…

互联网发展历程:从布线到无线,AC/AP的崭新时代

互联网的发展&#xff0c;一直在追求更便捷、更灵活的连接方式。在网络的早期&#xff0c;布线问题常常让人头疼。一项革命性的技术应运而生&#xff0c;那就是“无线AC/AP”。 布线问题的烦恼&#xff1a;繁琐的布线 早期网络的布线工作常常耗费时间和精力&#xff0c;尤其在大…

随机森林:人类基因组中病毒片段识别

百万年前人类基因组中基因组中就已经嵌入了病毒序列&#xff0c;其中一部分在某些条件下会致病&#xff0c;通过基因测序获得海量片段之后就可以判断正常基因和病毒序列了。 我们根据这种包含众多碱基的基因测序结果从中选取部分特征&#xff0c;关于特征的选取也是有好有坏的…

剑指offer62.圆圈中最后剩下的数字

这道题在算法课上的一个小故事上有一个类似的&#xff0c;就是一个军官打了败仗&#xff0c;带着他的几个兵逃到一个山洞&#xff0c;他们不想当俘虏想自杀&#xff0c;但是军官不想自杀但是又不好意思走&#xff0c;于是军官想了个办法&#xff0c;他们几个人围成一个圈&#…

数据库的新工具datagrip

datagrip的安装&#xff08;一路next即可&#xff09; 首先&#xff0c;双击datagrip安装包&#xff0c;会出现下面的界面&#xff0c;然后直接点击next 继续点击next 选中tatagrip&#xff0c;然后在点击next 点击install 勾选datagrip&#xff0c;然后在点击finish 直接点击…

【面试题】JavaScript高级四、高阶技巧

JavaScript高级四、高阶技巧 1、深浅拷贝 首先浅拷贝和深拷贝只针对引用类型 &#xff08;1&#xff09;浅拷贝 浅拷贝&#xff1a;拷贝对象的属性的值&#xff08;简单类型存的值就是值本身&#xff0c;引用类型存的值是对象的堆地址&#xff09;&#xff0c;所以如果拷贝的…

大模型PEFT技术原理(二):P-Tuning、P-Tuning v2

随着预训练模型的参数越来越大&#xff0c;尤其是175B参数大小的GPT3发布以来&#xff0c;让很多中小公司和个人研究员对于大模型的全量微调望而却步&#xff0c;近年来研究者们提出了各种各样的参数高效迁移学习方法&#xff08;Parameter-efficient Transfer Learning&#x…

gitee上传一个本地项目到一个空仓库

gitee上传一个本地项目到一个空仓库 引入 比如&#xff0c;你现在本地下载了一个半成品的框架&#xff0c;现在想要把这个本地项目放到gitee的仓库上&#xff0c;这时就需要我们来做到把这个本地项目上传到gitee上了。 具体步骤 1. 登录码云 地址&#xff1a;https://gite…

基于安防监控EasyCVR视频汇聚融合技术的运输管理系统的分析

一、项目背景 近年来&#xff0c;随着物流行业迅速发展&#xff0c;物流运输费用高、运输过程不透明、货损货差率高、供应链协同能力差等问题不断涌现&#xff0c;严重影响了物流作业效率&#xff0c;市场对于运输管理数字化需求愈发迫切。当前运输行业存在的难题如下&#xf…

Hlang社区项目说明

文章目录 前言Hlang社区技术前端后端 前言 Hello,欢迎来到本专栏&#xff0c;那么这也是第一次做这种类型的专栏&#xff0c;如有不做多多指教。那么在这里我要隆重介绍的就是这个Hlang这个项目。 首先&#xff0c;这里我要说明的是&#xff0c;我们的这个项目其实是分为两个…

【第三阶段】kotlin语言中的语法异常处理与自定义异常特点

fun main() {var name:String?nulltry{checkException(name)println(name!!.length)//不管name是不是null 后面都会执行}catch(e:Exception){println("你好$e")} }fun checkException(name:String?){name?:throw CustException()//?: 如果name为null 执行后面的抛…

【开发笔记】在Python中调用Docker,并运行SDK任务

目录 1 背景2 环境准备3 实现流程3.1 连接远程Docker3.1 创建容器3.2 解压SDK3.3 挂载容器卷3.4 运行任务3.5 判断任务状态3.6 容器的停止与销毁 4 可能遇到的问题 1 背景 使用Python&#xff0c;在远程Docker中创建一个容器&#xff0c;并在该容器中运行SDK任务 2 环境准备 …