1. 产生原因:
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
2. 原理分析:
每个Unix进程在进程表里都有一个进入点(entry),核心进程执 行该进程时使用到的一切信息都存储在进入点。当用 ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个 进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。
子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。那么会不会因为父进程太忙来不及 wait 子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢?不会。因为UNIX提供了一种机制可以保证,只要父进程想知道子进程结束时的状态信息,就可以得到。这种机制就是:当子进程走完了自己的生命周期后,它会执行exit()系统调用,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出码exit code,退出状态the terminationstatus of the process,运行时间the amount of CPU time taken by the process等),这些数据会一直保留到系统将它传递给它的父进程为止,直到父进程通过wait / waitpid来取时才释放。
3.解决方法:
(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。
(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler。在子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。
(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号
(4)fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。
发表评论
-
glibc版本信息及安装
2017-12-28 15:42 1404在高版本的glibc上编译的不能到底版本的glibc ... -
论GNU、Linux和GNU/Linux之间的关系
2017-12-28 15:17 364相信很多人看到了这个标题就会产生疑问,这篇文章到底要讲 ... -
linux的软链接与硬链接
2017-11-03 16:25 321Linux链接分两种,一 ... -
使用mailx发送邮件
2013-04-12 10:57 961mailx是UNIX系统上用来处理邮件的工具,使用它可以发送, ... -
查看linux系统信息
2013-02-25 18:58 921Linux系统信息查看命令大全 系统 # uname -a ... -
ssh 常用用法小结
2013-02-25 18:21 1855ssh 常用用法小结 在 ... -
在windows中使用UltraEdit编辑linux下文件
2013-01-18 13:21 5920在windows中使用UltraEdit编辑linux下文件 ... -
beyondCompare 工具比较linux下文件夹
2013-01-18 11:56 1223在windows环境下,用beyondCompare 工 ... -
Linux 目录结构以及作用详解
2013-01-06 14:58 7621、什么是文件系统 当 ... -
Linux通过脚本实现远程自动备份
2013-01-05 16:43 797考虑到在本机上备份数据,一旦该机器硬盘出现故障,数 ... -
(linux) find command
2013-01-04 13:22 1300find命令的主要功能是在 ... -
linux之cp/scp命令+scp命令详解
2012-12-25 16:34 944名称:cp使用权限:所有使用者使用方式:cp [options ... -
过滤小结(Linux)
2012-12-20 16:32 0============================ $ ... -
十项Linux操作系统安全管理技巧经验总结
2012-12-18 16:23 631由于Linux操作系统是一个开放源代码的免费操作系统,因此 ... -
Linux磁盘管理中quota命令介绍应用
2012-12-18 14:33 1340Quota 在Linux里,quota就是对硬盘进行限制 ... -
linux中ssh 连接缓慢解决方法
2012-12-13 13:30 1251重新安装机器的情况下 ... -
Redhat linux 命令行设置IP
2012-12-11 14:27 1244redhat linux版本命令行设置IP ifcon ... -
Linux软件包安装方式小结
2012-12-11 10:45 799Linux操作系统软件包安 ... -
Linux压缩解压的相关命令总结
2012-12-11 10:32 790Linux下常用压缩格 ... -
Linux下Python的安装方法
2012-11-29 18:41 724Linux下Python的安装方法: 1.下载源代码 ht ...
相关推荐
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,...
在Linux系统中查看进程及杀死僵尸进程的方法.docx
哦,不, -TLDR:您的进程可能会以不好的方式关闭,而僵尸进程将吞噬您的容器! 相反,只需使用lovely_touching : 下载它(此二进制文件可以在Centos / Redhat 5及更高版本的任何Linux版本上运行): wget ...
2.5.2 僵尸进程 2.5.3 进程和多任务的实现 2.6 Linux设备与网络 2.7 Shell控制台 第二部分 基础知识 第三章 Shell命令使用 3.1 控制台相关命令 clear 命令 echo 命令 yes 命令 3.2 目录操作命令 cd 命令 pwd ...
├day18-01 fork与sighal的组合(避免僵尸进程).mp4 ├day18-02 匿名管道之创建、缓冲区大小、阻塞模式.mp4 ├day18-03 知识点总结.mp4 ├day19_匿名管道子父进程通信、有名管道创建、删除.mp4 ├day20_有名管道的...
Task:僵尸进程的数量 CPU:%wa IOwait Mem: Swap:要尽可能的少用 uptime free:读取自文件:/proc/meminfo buffer存放要写回到磁盘的数据 cache存放从磁盘上读出的数据 -buffers/cache,表示一个应
僵尸进程一定要求处理 4.服务器尽量写成守护进程 5.应用链表保存在线用户信息 6.将所有用户信息保存到sqlite数据库中 7.能够导出相关数据到文本文档中(如聊天记录。。) 二.分工与描述 功能:1.(数据库及其...
1.70. 查看DB2是否存在僵尸进程 98 1.71. 监控执行成本最高的SQL语句 99 1.72. 监控运行最长的SQL语句 99 1.73. 给表增加generated always时需要注意(原) 99 1.74. 给表增加索引的时候,可以增加collect detailed ...
Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...