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,这个僵死进程就消失了。

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

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

相关文章

第4章:决策树

停止 当前分支样本均为同一类时&#xff0c;变成该类的叶子节点。当前分支类型不同&#xff0c;但是已经没有可以用来分裂的属性时&#xff0c;变成类别样本更多的那个类别的叶子节点。当前分支为空时&#xff0c;变成父节点类别最多的类的叶子节点。 ID3 C4.5 Cart 过拟合 缺…

TCP服务器—实现数据通信

目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.编译链接 5.测试 6.总结 前言 今天我们要介绍的是使用TCP协议实现数据通信&#xff0c;相比于之前写的UDP服务器实现数据信&#xff0c;在主体逻辑上并没有差别。客户端向服务器发送信息&#xff0c;服务器接受信息并回…

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基…

item_get_sales-获取TB商品销量详情

一、接口参数说明&#xff1a; item_get_sales-获取商品销量详情&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_get_sales 名称类型必须描述keyString是调用key&#xff08…

vim键盘图

国外&#xff1a;http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html&#xff0c;原创&#xff0c;有SVG图&#xff0c;有分步骤的图。 国内翻译&#xff1a;[https://blog.csdn.net/qq_41052753/article/details/101031847 有几个配色&#xff0c;很高清&…

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

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

mysql 索引 区分字符大小写

mysql 建立索引&#xff0c;特别是unique索引&#xff0c;是跟字符集、字符排序规则有关的。 对于utf8mb4_0900_ai_ci来说&#xff0c;0900代表Unicode 9.0的规范&#xff0c;ai表示accent insensitivity&#xff0c;也就是“不区分音调”&#xff0c;而ci表示case insensitiv…

Patch SCN一键解决ORA-600 2662故障---惜分飞

客户强制重启库之后,数据库启动报ORA-600 2037,ORA-745 kcbs_reset_pool/kcbzre1等错误 Wed Aug 09 13:25:38 2023 alter database mount exclusive Successful mount of redo thread 1, with mount id 1672229586 Database mounted in Exclusive Mode Lost write protection d…

【Docker】Docker network之bridge、host、none、container以及自定义网络的详细讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

在Orangepi5开发板3588s使用opencv获取摄像头画面

先感谢香橙派群的管理员耐心指导&#xff0c;经过不断的调试修改最后成功通过opencv调用mipi摄像头获取画面 就记录分享一下大概步骤希望大家少踩点坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我用的固件系统是ubuntu2022.0.4 固件是&#x…

Cenos7 搭建Minio最新版集群部署服务器(一)

------> 道 | 法 | 术 | 器 | 势 <------ 多台服务器间免密登录|免密拷贝 Cenos7 搭建Minio集群部署服务器(一) Cenos7 搭建Minio集群Nginx统一访问入口|反向动态代理(二) Spring Boot 与Minio整合实现文件上传与下载(三) CentOS7的journalctl日志查看方法 …

ES中倒排索引机制

在ES的倒排索引机制中有四个重要的名词&#xff1a;Term、Term Dictionary、Term Index、Posting List。 Term&#xff08;词条&#xff09;&#xff1a;词条是索引里面最小的存储和查询单元。一段文本经过分析器分析以后就会输出一串词条。一般来说英文语境中词条是一个单词&a…

炒股票怎么加杠杆_融资融券账户怎么开通

炒股票作为一种投资方式&#xff0c;可以带来不错的回报。然而&#xff0c;对于那些希望以较小的资金获得更高收益的投资者来说&#xff0c;加杠杆炒股票是一个值得考虑的选择。本文将为您介绍加杠杆炒股票的意义&#xff0c;以及如何开通融资融券账户。 加杠杆炒股票的意义&a…

FFmpeg 硬编码VideoToolBox流程

介绍 FFmpeg已经提供对 VideoToolBox 的编解码支持&#xff1b;主要涉及到的文件有videotoolbox.c、videotoolbox.h、videotoolboxenc.c、ffmepg_videotoolbox.c。在编译 FFmpeg 源码时&#xff0c;想要支持VideoToolBox&#xff0c;在 configure 时&#xff0c;需要–enable-…

考公-判断推理-逻辑判断-加强类

论点 论据 削弱 论点 转折之后 例题 例题 例题 例题 搭桥方向&#xff0c;论据推出论点 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…

使用公网访问内网IIS网站服务器【无需公网IP】

使用公网访问内网IIS网站服务器【无需公网IP】 文章目录 使用公网访问内网IIS网站服务器【无需公网IP】前言1. 注册并安装cpolar2. 创建隧道映射3. 获取公网地址 前言 这里介绍通过内网穿透&#xff0c;实现公网访问内网IIS网站服务器。 都知道&#xff0c;现在基本不会被分配…

Linux 终端命令之文件浏览(1) cat

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

如何自学(黑客)网络安全

前言&#xff1a; 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“…

日历应用行业研究:2022年全球市场规模大约为15.8亿元

日历应用程序可以通过提醒、安排会议和规划用户的日期、星期和月份来创建基本的时间块条目&#xff0c;以确保用户随时随地、尽可能高效地利用他们的时间。日历应用作为一个高效的时间管理工具&#xff0c;需要与项目管理工具&#xff0c;google邮箱&#xff0c;Outlook邮箱&am…