网站大量收购独家精品文档,联系QQ:2885784924

什么是孤儿过程和僵尸过程.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
什么是孤儿过程和僵尸过程

什么是孤儿进程和僵尸进程 一、定义:什么是孤儿进程和僵尸进程 ?? 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。 ?? 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。 注: ??? 僵尸进程将会导致资源浪费,而孤儿则不会。 子进程持续10秒钟的僵尸状态(EXIT_ZOMBIE) —————————————————— #include sys/types.h #include unistd.h #include stdio.h #include stdlib.h main() { ??? pid_t pid; ??? pid = fork(); ??? if(pid 0) ??????? printf(“error occurred!\n”); ??? else if(pid == 0) { ??????? printf(“Hi father! I’m a ZOMBIE\n”); ??????? exit(0);????? //(1) ??? } ??? else { ??????? sleep(10); ??????? wait(NULL);?? //(2) ??? } } (1) 向父进程发送SIGCHILD信号 (2) 父进程处理SIGCHILD信号 执行exit()时根据其父进程的状态决定自己的状态: ??? 如果父进程已经退出(没有wait),则该子进程将会成为孤儿进程过继给init进程 ??? 如果其父进程还没有退出,也没有wait(),那么该进程将向父进程发送SIGCHILD信号,进入僵尸状态等待父进程为其收尸。如果父进程一直没有执行wait(),那么该子进程将会持续处于僵尸状态。 子进程将成为孤儿进程 —————————————————— #include sys/types.h #include unistd.h #include stdio.h #include stdlib.h main() { ??? pid_t pid; ??? pid = fork(); ??? if(pid 0) ??????? printf(“error occurred!\n”); ??? else if(pid == 0) { ??????? sleep(6); ??????? printf(“I’m a orphan\n”); ??????? exit(0); ??? } ??? else { ??????? sleep(1); ??????? printf(“Children Bye!\n”); ??? } } # ./a.out Children Bye! # I’m a orphan (回车后将会进入#) # 二、影响: 僵尸进程会占用系统资源,如果很多,则会严重影响服务器的性能 孤儿进程不会占用系统资源 处理流程: 只要父进程不等wait(sys/wait.h)子进程,子进程都将成为孤魂野鬼zombie(zombie),unix中默认父进程总是想看子进程死后的状态? ? if? 父进程比子进程先退出? ??? 子进程将被init(id?? =?? 1)收养,最后的结果是zombie子进程彻底再见,系统资源释放? ? else??? ????? {? ??????? 子进程的zombie将一直存在,系统资源占用…? ??????? if?? 父进程dead??? ??????????? 子进程将被init(id?? =?? 1)收养,最后的结果是zombie子进程彻底再见,系统资源释放? ?? ????? else?? 类似的子进程zombie越来越多,系统就等死了!!!? ??? }? 三、如何防止僵尸进程 首先明白如何产生僵尸进程: 1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它 2、父进程没有调用wait()或waitpid()函数来等待子进程的结束 第一种方法:? 捕捉SIGCHLD信号,并在信号处理函数里面调用wait函数 转贴Richard Steven的Unix Network Programming代码 int main(int argc, char **argv) { ??????????????? … ??????? Signal(SIGCHLD, sig_chld); ??????????????? for(; ??????????????? } ??????????????? … } void sig_chld(int signo) { ??????? pid_t???????

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档