Linux僵尸进程怎么处理,Linux 僵尸进程如何处理

2023-10-29

Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,它的终止代号将告诉父进程这个任务是否已成功地完成。

为了遵循这些设计原则,不允许 Linux 内核在进程一终止后就丢弃包含在进程描述符字段中的数据。只有父进程发出了与被终止的进程相关的 wait() 类系统调用之后,才允许这样做。这就是引入僵死状态的原因:尽管从技术上来说进程已死,但必须保存它的描述符,直到父进程得到通知。

如果一个进程已经终止,但是它的父进程尚未调用 wait() 或 waitpid() 对它进行清理,这时的进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程(zombie process)。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了。

僵尸进程是如何产生的

为了观察到僵尸进程,我们自己写一个不正常的程序,父进程 fork 出子进程,子进程终止,而父进程既不终止也不调用 wait 清理子进程:

#include 

#include 

#include 

int main(void)

{

int i = 100;

pid_t pid=fork();

if(pid 

{

perror("fork failed.");

exit(1);

}

if(pid > 0)

{

printf("This is the parent process. My PID is %d.\n", getpid());

for(; i > 0; i--)

{

sleep(1);

}

}

else if(pid == 0)

{

printf("This is the child process. My PID is: %d. My PPID is: %d.\n", getpid(), getppid());

}

return 0;

}

把上面的代码保存到文件 zomprocdemo.c 文件中,并执行下面的命令编译:$ gcc zomprocdemo.c -o zomprocdemo

然后运行编译出来的 zomprocdemo 程序:$ ./zomprocdemo

AAffA0nNPuCLAAAAAElFTkSuQmCC

此时子进程已经退出,但是父进程没有退出也没有通过 wait() 调用处理子进程。我们使用 ps 命令查看进程的状态:

AAffA0nNPuCLAAAAAElFTkSuQmCC

上图红框中的大写字母 "Z" 说明 PID 为 112712 的进程此时处于僵死的状态。

让我们接着往下看!在结束 sleep 后父进程退出。当父进程退出后,子进程会变成孤儿进程,此时它会被一个管理进程收养。在不同的系统中,这个管理进程不太一样,早期一般是 init 进程,Ubuntu 上是 upstart,还有近来的 Systemd。但是它们都完成相同的任务,就是 wiat() 这些孤儿进程,并最终释放它们占用的系统进程表中的资源。这样,这些已经僵死的孤儿进程就彻底的被清除了。

僵尸进程的危害

在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号 PID,退出状态 the termination status of the process,运行时间 the amount of CPU time taken by the process 等)。直到父进程通过 wait / waitpid 来取时才释放。

如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。

如何处理僵尸进程

僵尸进程的产生是因为父进程没有 wait() 子进程。所以如果我们自己写程序的话一定要在父进程中通过 wait() 来避免僵尸进程的产生。

当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。

下面的 demo 中,父进程通过 wait() 等待子进程结束:

#include 

#include 

#include 

#include 

#include 

int main(void)

{

pid_t pid;

pid = fork();

if (pid 

{

perror("fork failed");

exit(1);

}

if (pid == 0) {

int i;

for (i = 3; i > 0; i--)

{

printf("This is the child\n");

sleep(1);

}

// exit with code 3 for test.

exit(3);

}

else

{

int stat_val;

wait(&stat_val);

if (WIFEXITED(stat_val))

{

printf("Child exited with code %d\n", WEXITSTATUS(stat_val));

}

}

return 0;

}

demo 中父进程不仅等待子进程结束,还通过 WEXITSTATUS 宏取到了子进程的 exit code。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux僵尸进程怎么处理,Linux 僵尸进程如何处理 的相关文章

  • 第十一届蓝桥杯C/C++寻找2020

    第十一届蓝桥杯C C 寻找2020 对我来说一开始主要是不会把文本的内容复制去数组里面 后来找了同学帮忙才解决的 直接上代码 结果是16520 include
  • python输入三门课程成绩_python脚本如何输入成绩求平均分?

    python脚本如何输入成绩求平均分 python脚本输入成绩求平均分的方法 脚本要实现功能 1 输入学生学号 2 依次输入学生的三门科目成绩 3 计算该学生的平均成绩 并打印 4 平均成绩保留两位小数点 计算该学生语文成绩占总成绩的百分比
  • 《消息队列高手课》该如何选择消息队列

    作为一个程序员 相信你一定听过 没有银弹 这个说法 这里面的银弹是指能轻松杀死狼人 用白银做的子弹 什么意思呢 我对这句话的理解是说 在软件工程中 不存在像 银弹 这样可以解决一切问题的设计 架构或软件 每一个软件系统 它都是独一无二的 你
  • SpringMVC的文件上传

    SpringMVC的文件上传 SpringMVC的文件上传 1 SpringMVC的请求 文件上传 客户端表单实现 2 SpringMVC的请求 文件上传 文件上传的原理 3 SpringMVC的请求 文件上传 单文件上传的代码实现1 4
  • 春眠不觉晓,redis知多少(2)

    春眠不觉晓 redis知多少 第二篇 4 持久化 4 1 原因 4 2 redis持久化机制 4 2 1 RDB 4 2 2 AOF 5 JAVA客户端 Jedis 5 1 介绍 5 2 使用步骤 5 3 Jedis操作各种redis的数据
  • 【毕设记录】Stata稳健性检验~ Robustness

    一些网上看的 自己用的tips汇总 1 DID 平行趋势检验 自己用的 1 在论文呈现上 可以绘制平行趋势图 也可以做一个Table表示平行趋势检验的结果 2 学习文献的做法 创建政策发生前两年的变量 比如政策是Rights 解释变量是A
  • python情感词典_sentimentpy模块进行中文文本情感分类

    sentimentpy是我根据R语言的一个文本情感分析包sentiment进行开发的 开发的初衷有 R的sentiment已经被弃坑 没人维护 Python比R更擅长文本处理 sentiment包不支持中文 而sentimentpy包有如下
  • nginx源码编译安装出现“make[1]: Leaving directory `/usr/local/nginx’“解决办法

    因为我所有的操作步骤都是按照上面来的 我的解决办法也非常的简单 如果你走到make这一步的时候只出现了一行 make 1 Leaving directory usr local nginx 1 12 1 提示 不用管它 继续走make in
  • 五人合伙最佳股份分配_五人合伙股份分配协议书范本

    股份合作企业与合伙企业是当前改制 改组中倍受关注的企业组织形式 那么合伙股份转让协议书又是怎么一回事呢 以下是在小编为大家整理的合伙股份转让协议书范文 感谢您的阅读 合伙股份转让协议书范文1转让方 甲方 身份证号码 住址 受让方 甲方 身份
  • Unity制作摇杆

    1 导入UGUI与Tools资源包 Unity中就会出现两个插件 2 导入人物模型资源包全部导入完之后 3 新建Plane 把人物模型拖到场景中 4 给人物模型制作动画状态机 4 1找到人物模型动画 并将全部的动画类型设置为Genic类型
  • 串行测试 并行测试_什么是并行测试,为什么要采用它?

    串行测试 并行测试 随着技术的进步 随着组织从手动测试转向Selenium测试自动化 测试解决方案变得比以往更具可扩展性 但是 大多数组织仍在努力的领域之一是可并行运行多个测试的可伸缩性 许多公司仍在使用顺序测试方法来提供质量保证 这会浪费
  • 大学生团体天梯赛(第六届)

    题目地址 天梯赛 include
  • 深度学习8

    Generative Adversarial Network 正如我们前面所说的 GAN里面有两个重要的东西 其中一个就是Generator Generator可以是一个NN 它的输入是一个vector 它的输出是一个更高维的vector
  • JSP-javabean技术

  • ELK 4.5——加入机器学习

    如果你也是 Elaticsearch 的粉丝 或者机器学习的爱好者 你肯定不会错过这个东西 5 月份 Elaticsearch 推出了新版本 5 4 准确地说是 Elastic Stack 全家桶都更新为 5 4 了 在 X pack 中的
  • Angular input延迟防抖debounceTime

    import Component OnInit from angular core import AbstractControl FormBuilder FormGroup Validators from angular forms imp
  • 【代码复现】NER之GlobalPointer解析

    前言 在NER任务中 主要分为三类实体 嵌套实体 非嵌套实体 不连续实体 今天分享方法以end to end的方式解决前两个问题 GlbalPointer 它利用全局归一化的思路来进行命名实体识别 NER 可以无差别地识别嵌套实体和非嵌套实
  • Mysql事务---MVCC详解

    Mysql数据库事务隔离级别 SQL 标准定义了四个隔离级别 READ UNCOMMITTED 读取未提交 事务的修改 即使没有提交 对其他事务也都是可见的 事务能够读取未提交的数据 这种情况称为脏读 READ COMMITTED 读取已提
  • Jetpack学习-1-Lifecycle+Activity源码分析

    解耦是软件开发亘古不变的追求 而Lifecycle正是这一名言的体现 Android开发过程中 有些功能不可避免与页面的生命周期关联 LifeCycle作为Jetpack中具有生命周期感知姓的组件 通过感知activity fragment

随机推荐

  • CVE-2022-22963:Spring Cloud Function SpEL 远程代码执行漏洞

    读者需知 本文仅供学习使用 由于传播和利用此文所造成的损失均由使用者本人负责 文章作者不为此承担责任 简介 SpringCloud Function作为SpringCloud家族成员最早在2017年提出 旨在为快速发展的Serverless
  • 以太坊开发文档09 - javascriptApi

    Web3 JavaScript appAPI 为了让您的应用程序能够在以太坊上工作 您可以使用web3 js库web3提供的对象 在底层 它通过RPC调用与本地节点通信 web3 js与任何暴露RPC层的以太坊节点一起工作 web3包含et
  • Vue3 isProxy

    isProxy 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理 实例
  • [计算机毕业设计]深度学习的图标型验证码识别系统

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • OpenGL ES 3.0 开发(一)

    什么是 OpenGLES OpenGLES 全称 OpenGL for Embedded Systems 是三维图形应用程序接口 OpenGL 的子集 本质上是一个跨编程语言 跨平台的编程接口规范 主要应用于嵌入式设备 如手机 平板等 由科
  • SpringBoot websocket + java swing 实现大文件上传与下载

    使用场景 无法直接登录服务器上传文件 使用web端上传超大文件出现超时 实现原理 上传 server端与client端建立websocket连接 client将待传文件进行分块 然后将文件的相关信息 文件名 md5值 分块大小 总块数 当前
  • 角谱衍射计算

    角谱衍射 角谱衍射计算 D F F T D FFT D FFT 即采用两次傅里叶变换 原始公式和 S
  • IP协议相关技术

    前言 其实我们在上网的时候并不是直接使用IP地址 同样IP地址还不方便记忆 这样我们就需要IP相关的技术来帮助我们通信 DNS 一开始人们使用TCP IP世界中的主机识别码来转换成具体的IP地址 这样人们就可以直接使用主机名称 但是随着网络
  • Chatglm2-6b模型相关问题

    Chatglm2 6b模型相关问题 1 Chatglm2 6b模型p tuning后推理答非所问 2 ChatGLM2 6b ptuning 3 ChatGLM2 6b部署 1 Chatglm2 6b模型p tuning后推理答非所问 据C
  • python词云 小说《庆余年》

    一 概述 使用jieba分词和wordcloud生产 小说的词云库 源码地址 https github com jw star pythonDemo tree master E5 BA 86 E4 BD 99 E5 B9 B4wordclo
  • HTML第一次作业

    什么是web前端 web前端就是由多种技术制作的 用来给用户展示的网页 也叫网站的前台部分 包括的技术有html css javascript jQueery bt等 什么是HTML hyper text maekuo language 骨
  • DVWA靶场存储型XSS漏洞实验

    文章目录 文章目录 前言 一 XSS基础 1 什么是XSS 2 XSS漏洞原理 3 XSS漏洞成因 4 XSS漏洞危害 5 存储型XSS漏洞原理 6 存储型XSS与反射型XSS的区别 二 DVWA靶场实战 1 存储型XSS漏洞利用 LOW
  • 求逆矩阵的常用三种方法

    1 待定系数法 矩阵A 1 2 1 3 假设所求的逆矩阵为 a b c d 则 这里写图片描述 从而可以得出方程组 a 2c 1 b 2d 0 a 3c 0 b 3d 1 解得 a 3 b 2 c 1 d 1 2 伴随矩阵求逆矩阵 伴随矩阵
  • node之Buffer(缓冲区)

    Node js Buffer 缓冲区 JavaScript 语言自身只有字符串数据类型 没有二进制数据类型 但在处理像TCP流或文件流时 必须使用到二进制数据 因此在 Node js中 定义了一个 Buffer 类 该类用来创建一个专门存放
  • 矢量绘图UI设计Sketch

    Sketch是一款Mac操作系统上常用的矢量图形编辑软件 旨在帮助用户设计和创建高质量的UI和UX界面 软件安装 Sketch 中文 以下是Sketch软件的一些主要特点 矢量工具和对象 Sketch提供了多种画线 填充 阴影 文本和形状等
  • UE4 部分命令知识点梳理

    UE4 部分命令知识点梳理 1 r SSGI Enable 0 1 屏幕空间 全局光照关闭 开启 2 DFO 距离场AO 指数指的是AO强度 遮挡最大距离 指的是距离场AO影响的最大距离 3 r forcelod 1 0 1 等 设置场景模
  • CSS中clear:both的作用

    clear both意思就是清除浮动 例如我们设置了三个div如下
  • es6中let var const 的特点及区别

    首先 var是定义一个变量常用的方法 与其相似的还有let和const 以下介绍他们三个的特点及不同 一 var var的用法很多 没有什么局限 可以对变量进行声明 例如 注意 var let const 是js的关键词 需要写在scrip
  • CSDN笔记

    拉普拉斯变换的收敛域 ROC 与逆变换 ILT 1 是否可积即是否收敛 如果可收敛 面积 拉氏值即为收敛域 1 收敛的条件 e jwt 积分为振荡函数 2 常系数线性微分方程对应线性时不变系统 其分析步骤有三 3 拉氏逆变换 ILT 的方法
  • Linux僵尸进程怎么处理,Linux 僵尸进程如何处理

    Linux 允许进程查询内核以获得其父进程的 PID 或者其任何子进程的执行状态 例如 进程可以创建一个子进程来执行特定的任务 然后调用诸如 wait 这样的一些库函数检查子进程是否终止 如果子进程已经终止 那么 它的终止代号将告诉父进程这