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);
}

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--僵死进程(僵尸进程)相关推荐

  1. linux 检查僵死进程,Linux下杀僵尸进程办法

    Linux认证辅导:Linux下杀僵尸进程办法 为了方便广大考生更好的复习,小编编辑整理提供了Linux认证:Linux下杀僵尸进程办法,以供各位考生考试复习参考,希望对考生复习有所帮助. 1) 检查 ...

  2. linux下的僵尸进程 - Zombie

    在linux中你可能进程听到有僵尸进程,那么究竟什么是僵尸进程,他又是怎样产生的呢?下面我们通过1个例子来说明一下. 我们知道退出一个进程用系统调用exit, 但是这并不意味着该进程马上就消失了,事实 ...

  3. linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...

  4. Linux中的defunct进程(僵尸进程)

    一.什么是defunct进程(僵尸进程)? 在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状 ...

  5. linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数

    linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...

  6. linux如何kill僵尸进程,linux 如何杀死僵尸进程——原理及操作

    linux 如何杀死僵尸进程 Posted on 2011 年 9 月 20 日 by Open-Source In UNIX System terminology, a process that h ...

  7. Linux如何杀掉僵尸进程

    Linux如何杀掉僵尸进程 1. 僵尸进程定义 ​ 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程.如果父进程先退出 ,子进程被init ...

  8. linux产生的僵尸进程如何处理

    linux产生的僵尸进程如何处理 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段,我们设定显示字段为s ...

  9. Kill杀死Linux中的defunct进程(僵尸进程)

    一.什么是defunct进程(僵尸进程)? 在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状 ...

  10. java defunct怎么杀掉_杀死Linux中的defunct进程(僵尸进程)的方法指南

    一.什么是defunct进程(僵尸进程)在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状态时 ...

最新文章

  1. Java面向对象概述
  2. linux 提交git,linux下git使用记录1 git 提交
  3. 利用Session实现一次性验证码(多学一招)
  4. 洛谷 P2590 BZOJ 1036 [ZJOI2008]树的统计
  5. windows计算机考试题,全国计算机等级考试一级Windows试题及解答.pdf
  6. 无废话aspose-words-18.6 java版破解
  7. Creo6.0无人机建模与结构设计视频教程
  8. 《Linux那些事儿之我是USB》我是U盘(14)冰冻三尺非一日之寒
  9. Caché 实操《Caché 算法与数据结构-数组原理》学习笔记
  10. spin_lock 自旋锁
  11. 怎么把视频转换成音频
  12. linux 回到用户主目录,linux中用户的主目录~
  13. AD19 报错记录 Un-Routed Net Constraint: Net LED Between Pad J3-10
  14. 基于Kinetis 60、HC-SR04超声测距模块的简易水情测量装置
  15. 什么是交换机?什么是路由器?网络通信的底层原理到底是怎么回事?不清楚的程序猿快来科普下吧!
  16. 计算机组成原理算术逻辑单元设计,计算机组成原理:带进位算术逻辑运算单元ALU设计实验.doc...
  17. vue-pdf遇到的问题
  18. html5公司年终抽奖程序源码按数字随机抽奖
  19. Unity 动画驱动位移的动画fbx导入设置
  20. FBCF反馈梳状滤波器设计

热门文章

  1. 复杂网络——图的可视化工具Gephi的使用附详细操作过程
  2. 联想小新air13pro重装系统_联想小新Air 13 Pro笔记本安装win10系统教程
  3. Android nrg格式,《Android Programming BNRG》笔记十七
  4. 【推荐系统】YoutubeDNN召回
  5. 2021年全球与中国汽车HVAC模块行业市场规模及发展前景分析
  6. 序列号已激活,重新登录再次提示激活
  7. ENVI中TIF格式文件打不开
  8. Android 4.0 全屏显示,在我的原道n90 ICS 4.0.3版本实验通过
  9. jetson agx xavier gpio-user驱动
  10. 记一次spring security403错误:{“timestamp“:“2022-06-30 14:05:32“,“status“:403,“error“:“Forbidden“,“mess...