Linux 僵死进程

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.rhkb.cn/news/91885.html

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

相关文章

2023,家用美容仪的“春天”来了吗?

【潮汐商业评论/原创】 编辑部的Jessica又买了一台水牙线&#xff0c;用她的话说&#xff1a;“能让自己更完美为什么不去试试呢&#xff1f;” 事实上&#xff0c;像这样的个护产品&#xff0c;Jessica不止一两个&#xff0c;从腰颈按摩仪到护肤导入仪、从全脸射频仪再到全身…

【2022吴恩达机器学习课程视频翻译笔记】3.3代价函数公式

忙了一阵子&#xff0c;回来继续更新 3.3 代价函数公式 In order to implement linear regression. The first key step is first to define something called a cost function. This is something we’ll build in this video, and the cost function will tell us how well…

代理模式概述

1.代理模式概述 学习内容 1&#xff09;概述 为什么要有 “代理” &#xff1f; 生活中就有很多例子&#xff0c;比如委托业务&#xff0c;黄牛&#xff08;票贩子&#xff09;等等代理就是被代理者没有能力或者不愿意去完成某件事情&#xff0c;需要找个人代替自己去完成这…

Hugging News #0814: Llama 2 学习资源大汇总

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

地址解析协议-ARP

ARP协议 无论网络层使用何种协议&#xff0c;在实际网络的链路上传输数据帧时&#xff0c;最终必须使用硬件地址 地址解析协议&#xff08;Address Resolution Protocol&#xff0c;ARP&#xff09;&#xff1a;完成IP地址到MAC地址的映射&#xff0c;每个主机都有一个ARP高速缓…

企业权限管理(十)-用户详情

用户详情 UserController findById方法 Controller RequestMapping("/user") public class UserController {Autowiredprivate IUserService userService;//查询指定id的用户RequestMapping("/findById.do")public ModelAndView findById(String id) thro…

htmlCSS-----弹性布局案例展示

目录 前言 效果展示 ​编辑 代码 思路分析 前言 上一期我们学习了弹性布局&#xff0c;那么这一期我们用弹性布局来写一个小案例&#xff0c;下面看代码&#xff08;上一期链接html&CSS-----弹性布局_灰勒塔德的博客-CSDN博客&#xff09; 效果展示 代码 html代码&am…

商用汽车转向系统常见故障解析

摘要&#xff1a; 车辆转向系统是用于改变或保持汽车行驶方向的专门机构。其作用是使汽车在行驶过程中能按照驾驶员的操纵意图而适时地改变其行驶方向&#xff0c;并在受到路面传来的偶然冲击及车辆意外地偏离行驶方向时&#xff0c;能与行驶系统配合共同保持车辆继续稳定行驶…

新能源汽车电控系统

新能源汽车电控系统主要分为&#xff1a;三电系统电控系统、高压系统电控系统、低压系统电控系统 三电系统电控系统 包括整车控制器、电池管理系统、驱动电机控制器等。 整车控制器VCU 整车控制器作为电动汽车中央控制单元&#xff0c;是整个控制系统的核心&#xff0c;也是…

实验二十九、正弦波变锯齿波电路

一、题目 将峰值为 1 V 1\,\textrm V 1V、频率为 100 Hz 100\,\textrm{Hz} 100Hz 的正弦波输入电压&#xff0c;变换为峰值为 5 V 5\,\textrm V 5V、频率为 200 Hz 200\,\textrm {Hz} 200Hz 的锯齿波电压。利用 Multisim 对所设计的电路进行仿真、修改&#xff0c;直至满足…

CentOS防火墙操作:开启端口、开启、关闭、配置

一、基本使用 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁用 &#xff1a; systemctl disable firewalld 开机启用 &#xff1a; systemctl enable firewalld systemctl是…

actuator/prometheus使用pushgateway上传jvm监控数据

场景 准备 prometheus已经部署pushgateway服务&#xff0c;访问{pushgateway.server:9091}可以看到面板 实现 基于springboot引入支持组件&#xff0c;版本可以 <!--监控检查--><dependency><groupId>org.springframework.boot</groupId><artifa…

Blazor简单教程(1.1):Razor基础语法

文章目录 前言基本文件配置引入Layout组件 语法介绍pagecodeRazor 语法[ 显式表达和隐式表达](https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/razor?viewaspnetcore-7.0#explicit-razor-expressions) 绑定简单绑定双向绑定带参数的函数绑定 依赖注入 前言 Blazor…

07 线程学习

一 qt线程角色 子线程完成与UI线程无关的工作,并且能够保持与UI线程通信 二 qt中线程 在QT中,对于 线程操作也是提供类(QThread)来进行封装,然后再学习该类的API接口 参数用途Header:#include qmake:QT += coreInherits:QObject //继承于QObject从官方文档可以看出,如果一…

CDH6.3.2搭建HIVE ON TEZ

参考 https://blog.csdn.net/ly8951677/article/details/124152987 ----配置hive运行引擎 在/etc/hive/conf/hive-site.xml中修改如下&#xff1a; hive.execution.engine mr–>tez hive.execution.engine 设为tez或者运行代码的时候&#xff1a; set hive.execution.eng…

Linux 路由三大件

对于 Linux 网络&#xff0c;好奇心强的同学一定思考过两个问题&#xff1a; 当我们发出一个包的时候&#xff0c;Linux 是如何决策该从哪个网卡&#xff08;假设有多个网卡&#xff09;、哪个下一跳发出这个包&#xff0c;用什么 IP 作为 source......当 Linux 收到一个包时&a…

pywinauto结合selenium实现文件上传

简介 PC端-Windows上的元素识别可用viewWizard工具 PC端-Windows上的元素操作可用pywinauto库 浏览器上网页的元素识别可用selenium 安装 pip installer pywinauto 使用须知 pywinauto官方文档 确定app的可访问技术 1、win32 API(backend“win32”) 一般是MFC、VB6、VCL…

小程序-uni-app:hbuildx uni-app 安装 uni-icons 及使用

一、官方文档找到uni-icons uni-app官网 二、下载插件 三、点击“打开HBuildX” 四、选择要安装的项目 五、勾选要安装的插件 六、安装后&#xff0c;项目插件目录 根目录uni_modules目录下增加uni-icons、uni-scss 七、引入组件&#xff0c;使用组件 <uni-icons type&qu…

【声波】声波在硼酸、硫酸镁 (MgSO4) 和纯水中的吸收研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

POST请求负载form-data表单数据需要同步修改header的Content-type

需要读公司的一个接口&#xff0c;显示负载是“表单数据” 一开始没注意类型&#xff0c;按照公司其他接口的情况用了json&#xff0c;结果返回的数据时间阶段没有体现dct的要求&#xff0c;脚本如下&#xff08;错误示范&#xff09; from requests import post from json im…