- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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.outChildren 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???????
您可能关注的文档
- 中介与调节.pdf
- 中介业务入门1.doc
- 中介圣经.doc
- 中介基础知识.pdf
- 中介备案申请表.pdf
- 两管帐划1.doc
- 中三班上学期高明小我任务总结(修改后).doc
- 两弹功臣邓稼教案.doc
- 中介宣战书.pdf
- 中介干事收费治理办法.doc
- 福莱特玻璃集团股份有限公司海外监管公告 - 福莱特玻璃集团股份有限公司2024年度环境、社会及管治报告.pdf
- 广哈通信:2024年度环境、社会及治理(ESG)报告.pdf
- 招商证券股份有限公司招商证券2024年度环境、社会及管治报告.pdf
- 宏信建设发展有限公司2024 可持续发展暨环境、社会及管治(ESG)报告.pdf
- 品创控股有限公司环境、社会及管治报告 2024.pdf
- 中信建投证券股份有限公司2024可持续发展暨环境、社会及管治报告.pdf
- 洛阳栾川钼业集团股份有限公司环境、社会及管治报告.pdf
- 361度国际有限公司二零二四年环境、社会及管治报告.pdf
- 中国神华能源股份有限公司2024年度环境、社会及管治报告.pdf
- 广西能源:2024年环境、社会及治理(ESG)报告.pdf
文档评论(0)