僵尸进程是什么意思?
发布时间 - 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系统调用收割其收养的所有僵尸进程。
为避免产生僵尸进程,实际应用中一般采取的方式是:
将父进程中对SIGCHLD信号的处理函数设为SIG_IGN(忽略信号);
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自定义中间件拦截请求与权限校验【步骤】


