Linux--僵死进程(僵尸进程)
1.僵死进程产生的原因或者条件:
当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程;(即就是子进程结束了,但父进程还没有结束的时候才会出现僵死进程)
(代码中 ,子先于父)(& 后台运行)
当一个进程结束的时候,只有进程的退出码被父进程获取后,父进程才能退出,进程的PCB才会被释放,否则父进程会一直等待退出码,在得到退出码之前,这个进程就是一个僵死进程。
2.演示僵死进程:
vim fork.c
#include<stdlib.h>
#include<wait.h>int main()
{char *s=NULL;int n=0;//控制父子进程的次数pid_t id=fork();assert(id!=-1);if(id==0)//子进程{ s="child";n=7;} else{ s="parent";n=3;int val=0;if(WIFEXITED(val))//如果正常退出{printf("val=%d\n",WEXITSTATUS(val));}wait(&val);printf("val=%d\n",val);} //父子进程一起运行int i=0;for(;i<n;i++){ printf("s=%s ,pid=%d ,ppid=%d n的地址=%p n=%d\n",s,getpid(),getppid(),&n,n);sleep(1);} exit(0);
}
![](/assets/blank.gif)
3.僵死进程带来的影响
(1)进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎 么样了。可父进程如果一直不读取,那子进程就一直处于Z状态。
(2)维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话 说,Z状态一直不退出,PCB一直要维护
(3)那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?
答:是的。因为数据结构 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空 间
(4)会造成内存泄漏
4.如何去处理僵死进程?
(1)父进程先结束
比如子进程的n改为7,父进程的n改为3;
(子进程会变成孤儿进程,孤儿进程会被收养,"父进程"就会获取退出码;(调用wait);
(红帽子是init(pid==1)收养孤儿进程,Unbuntu是操作系统指定了一个进程));
(2)父进程调用wait()方法获取子进程的退出码;
父进程执行7次,子进程改为3次;就能观察到僵死进程(放到后台运行&,ps);
#include<stdlib.h>
#include<wait.h>int main()
{char *s=NULL;int n=0;//控制父子进程的次数pid_t id=fork();assert(id!=-1);if(id==0)//子进程{ s="child";n=7;} else{ s="parent";n=3;int val=0;if(WIFEXITED(val))//如果正常退出{printf("val=%d\n",WEXITSTATUS(val));}wait(&val);printf("val=%d\n",val);} //父子进程一起运行int i=0;for(;i<n;i++){ printf("s=%s ,pid=%d ,ppid=%d n的地址=%p n=%d\n",s,getpid(),getppid(),&n,n);sleep(1);} exit(0);
}
处理僵死进程的方法一:
父进程执行3次,子进程改为7次;去观察僵死进程没有了;收养孤儿进程 的,一定会调用wait(就是获取退出码的);获取了退出码,操作系统就会把
pcb删掉,就不会出现僵死进程;
处理僵死进程的方法二:
父进程调用wait方法;
1命令, 2 系统调用 3 库函数
man 2 wait
else
{s="parent";n=7;int val=0;wait(&val);printf("val=%d\n",val);
}
其实两种处理僵死进程的方法的本质是一样的,都调用了wait方法,获取退出码;
但是两种方法都有区别:就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会去执行
1 #include <stdio.h>2 #include<assert.h>3 #include<unistd.h>4 #include<string.h>5 #include<stdlib.h>6 #include<wait.h>7 8 int main()9 {10 char *s=NULL;11 int n=0;//控制父子进程的次数12 13 pid_t id=fork();14 assert(id!=-1);15 16 if(id==0)//子进程17 {18 s="child";19 n=3;20 }21 else22 {23 s="parent";24 n=7;25 int val=0;26 wait(&val);27 printf("val=%d\n",val);28 }//获取退出码29 //父子进程一起运行30 int i=0;31 for(;i<n;i++)32 {33 printf("s=%s ,pid=%d ,ppid=%d n的地址=%p n=%d\n",s,getpid(),getppid (),&n,n);34 sleep(1);35 }36 exit(0);37 }
5.子进程的退出码
改写码:exit(3)
执行显示val=768;
man 2 wait
WIFEXITED:正常退出的状态;
WEXITSTATUS:获取退出码;
Linux--僵死进程(僵尸进程)相关推荐
- linux 检查僵死进程,Linux下杀僵尸进程办法
Linux认证辅导:Linux下杀僵尸进程办法 为了方便广大考生更好的复习,小编编辑整理提供了Linux认证:Linux下杀僵尸进程办法,以供各位考生考试复习参考,希望对考生复习有所帮助. 1) 检查 ...
- linux下的僵尸进程 - Zombie
在linux中你可能进程听到有僵尸进程,那么究竟什么是僵尸进程,他又是怎样产生的呢?下面我们通过1个例子来说明一下. 我们知道退出一个进程用系统调用exit, 但是这并不意味着该进程马上就消失了,事实 ...
- linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
- Linux中的defunct进程(僵尸进程)
一.什么是defunct进程(僵尸进程)? 在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状 ...
- linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数
linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...
- linux如何kill僵尸进程,linux 如何杀死僵尸进程——原理及操作
linux 如何杀死僵尸进程 Posted on 2011 年 9 月 20 日 by Open-Source In UNIX System terminology, a process that h ...
- Linux如何杀掉僵尸进程
Linux如何杀掉僵尸进程 1. 僵尸进程定义 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程.如果父进程先退出 ,子进程被init ...
- linux产生的僵尸进程如何处理
linux产生的僵尸进程如何处理 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段,我们设定显示字段为s ...
- Kill杀死Linux中的defunct进程(僵尸进程)
一.什么是defunct进程(僵尸进程)? 在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状 ...
- java defunct怎么杀掉_杀死Linux中的defunct进程(僵尸进程)的方法指南
一.什么是defunct进程(僵尸进程)在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状态时 ...
最新文章
- Java面向对象概述
- linux 提交git,linux下git使用记录1 git 提交
- 利用Session实现一次性验证码(多学一招)
- 洛谷 P2590 BZOJ 1036 [ZJOI2008]树的统计
- windows计算机考试题,全国计算机等级考试一级Windows试题及解答.pdf
- 无废话aspose-words-18.6 java版破解
- Creo6.0无人机建模与结构设计视频教程
- 《Linux那些事儿之我是USB》我是U盘(14)冰冻三尺非一日之寒
- Caché 实操《Caché 算法与数据结构-数组原理》学习笔记
- spin_lock 自旋锁
- 怎么把视频转换成音频
- linux 回到用户主目录,linux中用户的主目录~
- AD19 报错记录 Un-Routed Net Constraint: Net LED Between Pad J3-10
- 基于Kinetis 60、HC-SR04超声测距模块的简易水情测量装置
- 什么是交换机?什么是路由器?网络通信的底层原理到底是怎么回事?不清楚的程序猿快来科普下吧!
- 计算机组成原理算术逻辑单元设计,计算机组成原理:带进位算术逻辑运算单元ALU设计实验.doc...
- vue-pdf遇到的问题
- html5公司年终抽奖程序源码按数字随机抽奖
- Unity 动画驱动位移的动画fbx导入设置
- FBCF反馈梳状滤波器设计
热门文章
- 复杂网络——图的可视化工具Gephi的使用附详细操作过程
- 联想小新air13pro重装系统_联想小新Air 13 Pro笔记本安装win10系统教程
- Android nrg格式,《Android Programming BNRG》笔记十七
- 【推荐系统】YoutubeDNN召回
- 2021年全球与中国汽车HVAC模块行业市场规模及发展前景分析
- 序列号已激活,重新登录再次提示激活
- ENVI中TIF格式文件打不开
- Android 4.0 全屏显示,在我的原道n90 ICS 4.0.3版本实验通过
- jetson agx xavier gpio-user驱动
- 记一次spring security403错误:{“timestamp“:“2022-06-30 14:05:32“,“status“:403,“error“:“Forbidden“,“mess...