【Linux】僵尸进程和孤儿进程




在这里插入图片描述




一、僵尸进程


何为僵尸进程?


        在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时,其实它并没有真正的被销毁,操作系统内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等(比如malloc占用内存不释放,也会在此时释放),但是留下一个数据结构(只保留 struct task_struct 一个空壳子),这个结构保留了一定的信息(包括进程号 the process ID,退出状态,运行时间….),这些信息直到父进程通过 wait() / waitpid() 来取时才释放。这样设计的目的主要是保证父进程能够获取到子进程结束时的状态信息(父进程回收僵尸进程的时候可以根据 退出码 确定子进程的退出原因)。


而只剩下一个保留着退出状态等信息的数据结构的进程,即为僵尸进程



僵尸进程的危害


占用进程号:系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程僵尸进程会占用系统的进程表条目,如果系统中有大量僵尸进程存在而不被清理,可能会导致系统不能创建新的进程。这是因为进程ID(PID)是有限的,如果大部分都被僵尸进程占用,那么就没有足够的PID分配给新创建的进程。

有人说僵尸进程会占用内存:实际上,僵尸进程不占有任何内存空间,其本身并不会直接导致内存泄漏。内存泄漏更多是程序设计的问题,而不是操作系统层面的问题。僵尸进程最大的危害是占用进程号,导致系统无法产生新进程。



僵尸进程的的创建


子进程在 exit() 之后,父进程没有来得及处理,这时用 ps 命令就能看到子进程的状态是“Z”,即为僵尸状态

创造一个僵尸进程思路:保证父进程不死,子进程创建后使用 exit(0) 退出

这条 71780 号进程即为状态 Z 的僵尸进程(defunct 意思是已失效)

在这里插入图片描述


#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>int main(){printf("I am 父进程, pid : %d\n", getpid());pid_t id = fork();// 父进程:死循环维持生命if(id > 0){printf("这是新建的子进程: %d\n", id);while(1){printf("I am 父进程, pid : %d\n", getpid());sleep(1);};}// 子进程: 创建后退出,形成僵尸进程else if(id == 0){exit(0);		}return 0;
}


二、孤儿进程


何为孤儿进程?


孤儿进程:当某个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程并不是无父无母的 “野孩子”,而是会被系统默认的 init 进程所收养。(或者是现代 Linux 系统中的 systemd 进程,在早期的 Unix 系统中通常是 PID = 1init 进程)


        当一个进程成为孤儿进程后,它的直接父进程变成了 init systemd ,这样可以确保每个进程都有一个父进程。 init systemd 作为“养父”,不会像真正的父进程那样去管理和控制孤儿进程的行为,但它会负责清理孤儿进程的退出状态。也就是说,当孤儿进程最终终止时, init systemd 会接收到孤儿进程的退出通知,并更新系统的进程表。即 “养父” 会默认管理孤儿进程的退出状态,会帮它回收,不会使其变成僵尸进程,因此孤儿进程并不会有什么危害。



三、如何杀掉僵尸进程?


注意:僵尸进程不能被系统的 kill -9 信号杀死(SIGKILL只能发送给仍在运行的进程) (因为僵尸进程已经死了,是死掉的进程,当然也不能响应系统的信号)

1、被父进程回收

通过 wait() /waitpid() 才释放

2、可以杀掉它的父进程

        ​父进程被杀掉之后,僵尸进程会变成孤儿进程,孤儿进程会被系统的 1 号进程收留(即 Init 进程),1 号进程会检查该进程是不是僵尸进程,如果是的话则会将进程回收。


3、设置信号处理器

    父进程可以在创建子进程之前设置SIGCHLD信号的处理函数,当子进程结束时,操作系统会向父进程发送SIGCHLD信号。父进程可以在这个信号的处理函数中调用wait()waitpid()来清理僵尸进程。

#include <signal.h>
//...
void handle_child(int signum) {int status;waitpid(-1, &status, WNOHANG); // 非阻塞方式回收
}// 设置信号处理器
signal(SIGCHLD, handle_child);


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

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

相关文章

移除Microsoft Edge浏览器“由你的组织管理“提示的方法

背景&#xff1a; 点击Microsoft Edge浏览器右上角的按钮有时候会出现提示“由你的组织管理”。但实际上自己的电脑并没有被公司或其他企业管理。 解决方案&#xff1a; 提示&#xff1a;修改注册表如果操作不当会影响电脑&#xff0c;请提前备份注册表&#xff01;&#xff…

【Linux】【命令】diff

diff DescriptionsArgumentsExamples直接使用diff命令-u 输出格式-c 输出格式并列输出-s 和 -q 脚本示例示例1&#xff1a;目录及文件差异 Descriptions diff命令用于对比两个文件或者两个文件夹的不同之处&#xff0c;求基本语法如下所示&#xff1a; diff [OPTION]... FILES…

Oracle 11g 之 ADG 主备 Switchover 手动切换实践

全文目录&#xff1a; 开篇语&#x1f4dc; 前言&#x1f4d1; 摘要&#x1f4dd; 简介&#x1f50d; 概述&#x1f4bb; 核心源码解读&#x1f468;‍&#x1f4bb; 类代码方法介绍及演示 &#x1f4ca; 案例分析&#x1f310; 应用场景演示✅ 优缺点分析优点缺点 &#x1f9e…

ue5 扇形射线检测和鼠标拖拽物体

这里的NumTrace是要发射几根射线&#xff0c;Degrees Per Trace是每根射线之间的角度&#xff0c; 例如 要在角色面前实现一个180度的扇形射线检测&#xff0c;就需这两个变量乘起来等于180 TraceLength是射线的长度 下面是鼠标拖动物体逻辑&#xff0c;很简单 这里的Floor和…

【APIPost】学习与实践,如何使用 APIPost 测试 Java 后端项目

文章目录 1. 什么是 APIPost&#xff1f;2. 安装 APIPost3. APIPost 的基本界面介绍4. 基础功能介绍4.1 创建新请求4.2 设置请求头与参数4.3 查看响应结果4.4 保存请求 5. 环境变量配置5.1 创建环境变量5.2 在请求中使用环境变量 6. API 测试调试功能6.1 Mock 测试6.2 自动化测…

Unity DOTS中的Archetype与Chunk

Unity DOTS中的Archetype与Chunk 在Unity中&#xff0c;archetype&#xff08;原型&#xff09;用来表示一个world里具有相同component类型组合的entity。也就是说&#xff0c;相同component类型的entity在Unity内部会存储到一起&#xff0c;共享同一个archetype。 使用这样的设…

数据的全量加载和增量加载

全量和增量是数据加载过程中常用的两种方法&#xff0c;它们在数据提取和加载策略上有明显的区别&#xff1a; 全量加载&#xff08;Full Load&#xff09; 定义&#xff1a;全量加载是指每次将源系统中的所有数据提取并加载到目标系统中。 特点&#xff1a; 数据完整性&…

一篇文章入门Pytest!

目录 一、安装 二、语法 三、执行 四、前后置setup/teardown 五、fixture 六、数据驱动 七、报告 一、安装 需要安装的库 pytest pytest-html 生成HTML格式的测试报告 pytest-xdist 用例分布式执行&#xff0c;多CPU分发 pytest-ordering …

【Bug】iOS 不支持运行或调试你的项目的上一个生成版本。 请先确保生成解决方案,再运行或调试它。

文章目录 问题问题代码原因解决处理Bug的具体步骤 问题 在windows以hot restart&#xff08;hot restart不需要mac 而pair to mac需要&#xff09;的方式部署到iphone报&#xff1a;不支持运行或调试你的项目的上一个生成版本。 请先确保生成解决方案&#xff0c;再运行或调试…

基于SSM宠物信息交流平台JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

东芝TB67B008FTG三相无刷马达驱动IC

TB67B008FTG是一款无刷直流电机用的三相PWM驱动器&#xff0c;专为无传感器的应用场景设计。它具有一系列突出的功能&#xff0c;使其在现代电机控制中发挥重要作用&#xff0c;尤其是在需要高效、稳定运行的场景中。本文将详细介绍TB67B008FTG的特点、应用以及它在电机控制领域…

idea和webstorm性能优化

idea和webstorm性能优化 简介 今天打开了idea弹了一个弹窗&#xff0c;大概意思如下。 The IDE has detected Microsoft Defender with Real-Time Protection enabled. It might severely degrade IDE performance. It is recommended to add the following paths to the Def…

要卸载 RVM(Ruby Version Manager)和它管理的所有 Ruby 版本

1.卸载 RVM 和 Ruby 版本 在终端中运行以下命令以卸载 RVM 和它所管理的所有 Ruby 版本&#xff1a; rvm implode此命令将删除 RVM 和所有安装的 Ruby 版本。系统会提示你确认卸载操作&#xff0c;输入 yes 确认。 2. 删除 RVM 残留文件 RVM 可能会在系统中留下配置文件&#…

【Axure高保真原型】移动案例

今天和大家分享多个常用的移动案例的原型模板&#xff0c;包括轮盘滑动控制元件移动、页面按钮控制元件移动、鼠标单击控制元件移动、元件跟随鼠标移动、鼠标拖动控制元件移动、键盘方向键控制元件移动&#xff0c;具体效果可以点击下方视频观看或打开下方预览地址查看哦 【原…

java脚手架系列10-统一缓存、分布式锁

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…

LeetCode 每日一题 最小差值 II

最小差值 II 给你一个整数数组 nums&#xff0c;和一个整数 k 。 对于每个下标 i&#xff08;0 < i < nums.length&#xff09;&#xff0c;将 nums[i] 变成 nums[i] k 或 nums[i] - k 。 nums 的 分数 是 nums 中最大元素和最小元素的差值。 在更改每个下标对应的值之后…

HotSpot VM

HotSpot VM 是 Sun JDK 和 OpenJDK 中所带的虚拟机&#xff0c;也是目前使用范围最广的 Java 虚拟机。它在 Java 技术中起着至关重要的作用&#xff0c;其历史可追溯至 1997 年 Sun 公司收购设计它的 “Longview Technologies” 小公司。HotSpot VM 最初并非为 Java 语言开发&a…

算法笔记day06

目录 1.添加逗号 2.跳台阶 3.扑克牌顺子 1.添加逗号 添加逗号_牛客题霸_牛客网 算法思路&#xff1a; 按照提议模拟即可&#xff0c;从后向前遍历字符串&#xff0c;遍历三个字符之后&#xff0c;将其插入将这三个字符插入到新的字符串中再加上逗号。 #include <iostrea…

Thymeleaf模板引擎教程(详细总结)

Thymeleaf 是一个服务器端 Java 模板引擎&#xff0c;能够处理 HTML 、 XML 、 CSS 、 JAVASCRIPT 等模板文件。 Thymeleaf 模板可以直接当作静态原型来使用&#xff0c;它主要目标是为开发者的开发工作流程带来优雅的自然 模板&#xff0c;也是 Java 服务器端 HTML5 开…

Docker设置日志滚动

问题描述 Docker 容器中的进程会将打印到控制台(console)的日志保存到容器的目录下&#xff0c;默认的 Docker 配置不带有日志的回滚。会在自己的容器目录下往同一个日志文件中不停写入&#xff0c;最后会导致磁盘空间占满的问题。 解决方案 方案一&#xff1a;全局范围内修…