c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程
目录
1 前言
2 僵尸进程
2.1 进程简介
2.2 僵尸进程例子
2.3 僵尸进程危害
3 处理僵尸进程
3.1 kill 命令
3.2 kill 父进程
3.3 reboot
3.4 magic sysrq key 方法
1 前言
在 centos7 跑 Docker 和 k8s 时,偶尔会出现 systemctl 失效的情况,现象如下:Failed to get properties...
查看系统进程,发现僵尸进程(zombie/defunct):ps -ef | grep defunct
2 僵尸进程
2.1 进程简介
在 linux 中,父进程通过 fork 调用创建子进程。
子进程执行完毕之后,内核会释放该子进程所占用的资源,包括打开的文件,占用的内存等,但仍然会在进程表中保留一个槽位(slot)存放该子进程的文件描述符(比如进程PID、进程退出状态、进程运行时间等),直到父进程发送 wait() 或 waitpid() 调用,内核才会把子进程文件描述符从进程表中彻底清除。如果父进程不调用 wait() 或 waitpid()对子进程进行清理,那子进程将处于僵尸状态。
但是如果父进程先于子进程结束的话,会导致子进程变成僵尸进程吗?答案是不会。因为每当进程结束的时候,系统都会扫描当前所有运行的进程,查找是否有这个结束进程的子进程,如果有,就由 init 进程(或者 systemd 进程)来接管子进程,成为子进程的新父进程,并自动 wait 这个子进程,确保以后该子进程不会变成僵尸进程。
2.2 僵尸进程例子
下面展示一个 c 语言编写的僵尸进程样例,样例中主进程并不会 wait 子进程,生成文件 zombie.c:#include
#include
#include
int main(void) {
int i = 60;
pid_t pid = fork();
if ( pid < 0 ) {
perror( "fork error." );
exit(1);
}
if ( pid == 0 ) {
printf( "This is the child process. My PID is: %d. My PPID is: %d\n", getpid(), getppid() );
}
if (pid > 0) {
printf( "This is the parent process. My PID is %d.\n", getpid() );
for( ; i > 0; i-- ) {
sleep(1);
}
}
return 0;
}
编译 zombie.c 并执行 zombie:yum install gcc
gcc zombie.c -o zombie
./ zombie
上图中主进程 PID:11552,子进程 PID:11553。执行如下语句:发现 PID 为 11553 的子进程正好处于僵尸状态(defunct),由程序可知,因为主进程并没有 wait 子进程。ps aux | grep -i defunct
分析一下 zombie.c,特别注意 fork() 调用,在 pid_t pid = fork() 语句之前,只有一个进程,但是执行到这条语句之后,就变成2个进程了,这2个进程几乎完全相同,将要执行的下一条语句都是 if ( pid < 0 )。
fork() 函数比较特殊,它被调用一次,却能够返回两次结果,它的返回值也根据进程的不同而不同:1)在父进程中,fork 返回新创建子进程的 PID
2) 在子进程中,fork 返回 0
3)如果出现错误,则 fork 返回负值
2.3 僵尸进程危害
如果父进程没有 wait 子进程,子进程将变成僵尸状态,处于僵尸状态的进程将保留进程号(PID),众所周知,操作系统对进程号是有限制的,如果出现大量僵尸进程占用进程号,系统有可能无法创建新的进程。
3 处理僵尸进程
一般情况下处于僵尸状态的进程很难杀掉,当然你可以试着删除:
3.1 kill 命令kill -9 PID
3.2 kill 父进程kill -9 PPID
3.3 reboot
如果采用上面两种方式依然杀不掉,那么只能通过重启了。reboot
如果重启也不生效,可以需要加选项 -nfreboot -nf
3.4 magic sysrq key 方法
有时执行 reboot 命令还是无法重启,可以执行 magic sysrq 方法来通过提供给用户的 proc 接口直接向 kernel 发底层命令。
重启命令如下:echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
强制关机命令:echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程相关推荐
- R语言学习笔记——入门篇:第三章-图形初阶
R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...
- 基于pbl的c语言课程设计及学习指导 答案,基于PBL的C语言课程设计及学习指导前三章答案1.0版...
<基于PBL的C语言课程设计及学习指导前三章答案1.0版>由会员分享,可在线阅读,更多相关<基于PBL的C语言课程设计及学习指导前三章答案1.0版(67页珍藏版)>请在人人文库 ...
- C语言学习1——第一、二、三章学习记录
总述 大一新生开始学习c语言,记录一下学习过程,本人看的是谭浩强老师的C程序设计,在写这个博客之前已经学习了前三章,这一篇就给前三章做一个总结和记录学习. 注:本博客所有知识点均出自C程序设计(第五版 ...
- C语言数据结构【手抄版】第三章 栈和队列
注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...
- C语言深度剖析书籍学习记录 第三章 预处理
宏 _LINE_ 表示正在编译的文件的行号 _FILE_ 表示正在编译的文件的名字 _DATE_ 表示编译时刻的日期字符串,例如: "25 Dec 2007" _TIME_ 表示编 ...
- 学习C语言必须知道的理论知识(第三章-C语句)
一个函数包括:声明部分和执行部分. C语言的分类: 1.控制语句 控制语句分为9种:1.if()...else... (条件语句) 2.for()... (循环语句) 3. ...
- 【最详细】数据结构(C语言版 第2版)第三章课后习题答案 严蔚敏 等 编著
所有章节答案合集-->传送门 1.选择题 ( 1)若让元素 1, 2, 3, 4, 5 依次进栈,则出栈次序不可能出现在()种情况. A. 5, 4, 3, 2, 1 B. 2, 1, 5, 4 ...
- c语言第四版课后答案第三章3.4,算法与数据结构C语言版课后习题答案(机械工业出版社)第3,4章 习题参考答案...
第3章 栈和队列 一.基础知识题 3.1 有五个数依次进栈:1,2,3,4,5.在各种出栈的序列中,以3,4先出的序列有哪几个.(3在4之前出栈). [解答]34215 ,34251, 34521 3 ...
- c语言 任意自然数的分解加法,第三章 1. 代数系,自然数,整数,有理数,实数,复数...
群实质上是集合加上满足群公理的乘法运算的数学实体.现在我们将其推广,在集合上加上不同的附加结构(不同公理),研究可能形成的代数系及其性质. 一. 自然数 自然数$\mathbb{N}=\{0,1,2, ...
最新文章
- 性能测试初学_loadrunner base64/md5 编码 解码
- mysql中迅速插入百万条测试数据的方法
- Android Service与Activity的交互
- linux ubuntu 开机自动启动 fixfox 并打开指定网站
- 信息系统项目管理师 必背
- java 泛型 引用_Java嵌套自引用泛型
- 远程控制python
- 基础编程题目集 6-3 简单求和 (10 分)
- metinfo mysql off_利用Sqlmap测试MetInfo企业网站管理系统MySql注入漏洞
- 不可能解开的谜题 (程序员修炼之道,评注者序)
- 图像分割各种评测标准
- python爬虫之模拟登陆(CSDN篇)
- 高数习题第七章总练习题(下)
- 计算机组成原理头歌实验
- java定制化报表_定制自己的报表!7款实用开源报表工具
- 用牛顿法求算术平方根python
- marked is not a function问题解决
- 前端和后端的JSON数据交互
- 让人扎心的Nginx rewrite跳转及Location
- 只需这10招,强壮骨骼到老非你莫属