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

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

相关文章

【Linux】计算机网络协议详解与通信原理探究

目录 1、协议 1.1.初识协议 1.2.协议分层 日常通信的例子&#xff1a; 1.3.OSI 七层模型 1.4.TCP/IP五层(或四层)模型 1.5.OS和网络之间的关系 1.6.协议的本质 2.局域网通信 2.1.什么是局域网&#xff1f; 2.2.关于报文相关基础知识 报文和协议的关系&#xff1a; …

传输层协议UDP详解

目录 一. 知识准备 1.1 传输层 1.2 重识端口号 二. UDP协议 三. UDP协议特点 一. 知识准备 1.1 传输层 前面已经讲过&#xff0c;HTTP协议是应用层协议&#xff0c;在此之前&#xff0c;我们短暂的认为HTTP是直接通过应用层与外界通信的。但是我们要知道&…

4本SCI/SSCI期刊更名,10月WOS更新!速看!

期刊动态 2024年10月科睿唯安期刊目录更新 2024年10月22日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;此次更新&#xff0c;期刊被编辑除名11本&#xff0c;停止出版1本&#xff0c;4本更名&#xff0c;停产1本&#xff0c;新增63本。 剔除期刊 11本期刊被剔 Enginee…

go-zero系列-限流(并发控制)及hey压测

参考地址&#xff1a; go-zero系列-限流(并发控制)&#xff1a;https://go-zero.dev/docs/tutorials/service/governance/limiter hey地址&#xff1a;https://github.com/rakyll/hey1、压测工具hey下载安装&#xff1a; 会安装到GOPATH/bin目录下 go install github.com/ra…

AI未来会拥有人类的情感吗,情感计算领域进展如何?

AI在情感理解方面目前还处于相对初级的阶段,但已经有了一些令人鼓舞的进展。 一般来说,AI系统可以通过自然语言处理和计算机视觉技术来检测和分析人类的情感表现,但要真正理解背后的情感原因和动机还面临很大挑战。 目前在情感计算领域&#xff0c;研究者们已经取得了显著的进…

重生之“我打数据结构,真的假的?”--1.顺序表(无习题)

C语言中的顺序表详细总结 1. 概述 顺序表&#xff08;Sequential List&#xff09;是一种线性数据结构&#xff0c;用于存储具有相同数据类型的一组元素。顺序表采用一段连续的存储空间&#xff0c;使用数组来实现&#xff0c;能够高效地支持随机访问操作。在 C 语言中&#…

Unity--AssestBundles--热更新

使用Node.js搭建AssestBundle服务器并验证AB包热更新 一、服务器部分 使用NodeJs作为服务器&#xff0c; 使用Express为基础网页模版。 当然&#xff0c; 使用其他的FTP&#xff0c;http服务器也可以&#xff0c; 基础逻辑是存放资源的位置。 1.下载Node.js 下载地址:https…

AI动漫翻唱项目玩法拆解,起号涨粉咔咔猛,实操干货分享

最近&#xff0c;一种把AI技术和动漫翻唱结合起来的视频&#xff0c;在各大平台火了起来&#xff0c;成了社交媒体的新热门。 下面&#xff0c;我们就来聊聊这种视频的制作方法和赚钱技巧&#xff0c;希望能给你的副业加点料。 一、AI动漫翻唱视频的魅力 AI动漫翻唱视频能迅…

[Luogu 4630] APIO2018 铁人两项(广义圆方树)

铁人两项 求满足存在 x → y x \rightarrow y x→y 和 y → z y \rightarrow z y→z 的不相交简单路径的有序点对 ( x , y , z ) (x, y, z) (x,y,z) 的方案数。 即&#xff0c;选择的路径只经过同一个点至多一次。 线性做法。 广义圆方树 可以解决一些“每个点至多经过…

MySQL进阶之(十一)MySQL事务日志-redo log

十一、MySQL事务日志-redo log 11.1 Buffer Pool11.1.1 缓存的重要性11.1.2 InnoDB 的 Buffer Pool11.1.3 InnoDB 存储引擎线程 11.2 redo 日志引入11.3 redo 日志的好处和特点11.3.1 好处11.3.2 特点 11.4 redo 日志的组成11.5 redo 日志的整体流程11.6 redo 日志的刷盘策略11…

nodejs 实现docker 精简可视化控制

地址 https://github.com/xiaobaidadada/filecat 说明 使用react 和nodejs 实现的非常轻量的服务docker管理。

YOLOv11改进-卷积-引入小波卷积WTConv 解决多尺度小目标问题

本篇文章将介绍一个新的改进机制——WTConv&#xff08;小波卷积&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。YOLOv11模型相比较于前几个模型在检测精度和速度上有显著提升&#xff0c;但其仍然受卷积核感受野大小的限制。因此&#…

【Wireshark笔记】如何在Wireshark中使用过滤器去除TCP Dup ACK

【Wireshark笔记】如何在Wireshark中使用过滤器去除TCP Dup ACK 在网络分析和故障排查中&#xff0c;Wireshark是最常用的工具之一。当分析TCP流量时&#xff0c;我们经常会遇到TCP Dup ACK&#xff08;重复ACK&#xff09;包。这些包通常意味着网络中的丢包或重传&#xff0c…

JRT怎么从IRIS切换到PostGreSql库

1.执行M导出得到建库脚本文件 2.下载生成的脚本到本地D盘 3.修改驱动为PostGreSql 4.修改连接串 5.到PostGreSql里面创建一个jrtlis的数据库&#xff0c;模式为jrt 6.启动网站点击导入脚本按钮 导入完成了就可以正常使用PostGreSql库了

QToolButton工具按钮控件

QToolButton是Qt框架中的一个特殊且功能丰富的控件&#xff0c;它主要用于工具栏或类似场景中&#xff0c;为用户提供快速访问命令或选项的按钮。通常是文字或图片或者图片文字&#xff01; 构造函数 explicit QToolButton(QWidget *parent nullptr); 初始化添加图片 QToolB…

Redis中String类型常见的应用场景

目录 一. 缓存功能什么是缓存?Redis的工作原理热点数据的过期策略是什么? 二. 计数功能三. 会话(session)共享Session会话是用来解决什么问题的使用Redis集中管理Session 一. 缓存功能 什么是缓存? 缓存是一种用于存储数据的计算机硬件或软件组件. 缓存核心功能是加快数据…

VSCODE 导入cubeide工程

1.下载vscode及插件STM32 VS Code Ectersion 版本号1.0.0&#xff0c;之后这个有导入功能。 2.等待自动安装对应插件&#xff0c;提示缺少什么就补什么 3.在左侧出现stm32图标。点击Import a local project导入本地项目。 4.报错 [{"resource": "/f:V11/cmak…

批量合并同名Labelme标注文件内容

假如一批数据&#xff0c;分两批分别标注了分割和关键点的json数据&#xff0c;或是分别标注了不同的类别&#xff0c;使用时如果要合并使用&#xff0c;就需要对两个同名的json文件进行合并。 json1: json2: 合并后json&#xff1a; 脚本内容如下&#xff1a; import os imp…

HubSpot的AI技术:企业营销和销售的好帮手

现在做生意&#xff0c;竞争真挺大的。大家都想找到更好的方法来做营销和销售。HubSpot的AI技术&#xff0c;就像是给我们企业配了个智能小助手&#xff0c;让营销和销售变得更加轻松、高效。 推荐你喜欢的东西&#xff0c;购物更开心 企业老板肯定知道&#xff0c;让客户开心…

html 登入界面,用户注册界面相关的标签及案例

案例效果图 以上界面的完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…