僵尸进程是什么意思?

发布时间 - 2017-06-21 00:00:00    点击率:

 

 

 

在UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个表项(进程控制块PCB),处于”终止状态“的进程。这发生于子进程需要保留表项以允许其父进程读取子进程的exit status:一旦退出态通过wait系统调用读取,僵尸进程条目就从进程表中删除,称之为”回收(reaped)”。正常情况下,进程直接被其父进程wait并由系统回收。进程长时间保持僵尸状态一般是错误的并导致资源泄漏。

英文术语zombie process源自en:zombie — 不死之人,隐喻子进程已死但仍然没有被收割。与正常进程不同,kill命令对僵尸进程无效。孤儿进程不同于僵尸进程,其父进程已经死掉,但孤儿进程仍能正常执行,但并不会变为僵尸进程,因为被init(进程ID号为1)收养并wait其退出。

子进程死后,系统会发送SIGCHLD 信号给父进程,父进程对其默认处理是忽略。如果想响应这个消息,父进程通常在SIGCHLD 信号事件处理程序中,使用wait系统调用来响应子进程的终止。

僵尸进程被收割后,其进程号(PID)与在进程表中的表项都可以被系统重用。但如果父进程没有调用wait,僵尸进程将保留进程表中的表项,导致了资源泄漏。某些情况下这反倒是期望的:父进程创建了另外一个子进程,并希望具有不同的进程号。如果父进程通过设置事件处理函数为SIG_IGN显式忽略SIGCHLD信号,而不是隐式默认忽略该信号,或者具有SA_NOCLDWAIT标志,所有子进程的退出状态信息将被抛弃并且直接被系统回收。

UNIX命令ps列出的进程的状态(”STAT”)栏标示为 “Z“则为僵尸进程。

收割僵尸进程的方法是通过kill命令手工向其父进程发送SIGCHLD信号。如果其父进程仍然拒绝收割僵尸进程,则终止父进程,使得init进程收养僵尸进程。init进程周期执行wait系统调用收割其收养的所有僵尸进程。

为避免产生僵尸进程,实际应用中一般采取的方式是:

  1. 将父进程中对SIGCHLD信号的处理函数设为SIG_IGN(忽略信号);

  2. fork两次并杀死一级子进程,令二级子进程成为孤儿进程而被init所“收养”、清理。

例子:

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include zuojiankuohaophpcnsys/wait.hyoujiankuohaophpcn #include zuojiankuohaophpcnstdlib.hyoujiankuohaophpcn #include zuojiankuohaophpcnunistd.hyoujiankuohaophpcn   int main(void) {   pid_t pids[10];   int i;     for (i = 9; i >= 0; --i) {     pids[i] = fork();     if (pids[i] == 0) {       sleep(i+1);       _exit(0);     }   }     for (i = 9; i >= 0; --i)     waitpid(pids[i], NULL, 0);     return 0; } 


# 其父  # 情况下  # 是指  # 设为  # 但在  # 长时间  # 两次  # 对其  # 英文  # 之人 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 创业网站制作流程,创业网站可靠吗?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何在腾讯云免费申请建站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  EditPlus中的正则表达式 实战(1)  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  javascript如何操作浏览器历史记录_怎样实现无刷新导航  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  微信小程序 scroll-view组件实现列表页实例代码  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  开心动漫网站制作软件下载,十分开心动画为何停播?  HTML 中动态设置元素 name 属性的正确语法详解  企业网站制作这些问题要关注  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  ,在苏州找工作,上哪个网站比较好?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Linux系统运维自动化项目教程_Ansible批量管理实战  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Android GridView 滑动条设置一直显示状态(推荐)  三星网站视频制作教程下载,三星w23网页如何全屏?  如何在云指建站中生成FTP站点?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  微信公众帐号开发教程之图文消息全攻略  如何基于云服务器快速搭建个人网站?  Linux安全能力提升路径_长期防护思维说明【指导】  郑州企业网站制作公司,郑州招聘网站有哪些?  新三国志曹操传主线渭水交兵攻略  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  js实现点击每个li节点,都弹出其文本值及修改  浅谈redis在项目中的应用  Laravel distinct去重查询_Laravel Eloquent去重方法  python中快速进行多个字符替换的方法小结  Laravel集合Collection怎么用_Laravel集合常用函数详解  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  详解CentOS6.5 安装 MySQL5.1.71的方法  Thinkphp 中 distinct 的用法解析  Linux网络带宽限制_tc配置实践解析【教程】  iOS验证手机号的正则表达式  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】