什么是孤儿进程和僵尸进程.doc什么是孤儿进程和僵尸进程.doc
什么是孤么程和尸么程儿僵
一、定么,什么是孤么程和尸么程儿僵
僵个没尸么程,一子么程在其父么程么有么用wait()或waitpid()的情下退出。么子么程就是尸么程。况个僵
孤么程,一父么程退出~而的一或多子么程么在行~那么那些子么程成么孤么程。孤么程被儿个它个个运将儿儿将init么程(么程么号1)所收么~由并
init么程么么完成么收集工作。它状
注,
僵将会儿会尸么程么致么源浪么~而孤么不。
子么程持么10秒么的尸么僵状(EXIT_ZOMBIE)——————————————————
#i...
什么是孤儿进程和僵尸进程.doc
什么是孤么程和尸么程儿僵
一、定么,什么是孤么程和尸么程儿僵
僵个没尸么程,一子么程在其父么程么有么用wait()或waitpid()的情下退出。么子么程就是尸么程。况个僵
孤么程,一父么程退出~而的一或多子么程么在行~那么那些子么程成么孤么程。孤么程被儿个它个个运将儿儿将init么程(么程么号1)所收么~由并
init么程么么完成么收集工作。它状
注,
僵将会儿会尸么程么致么源浪么~而孤么不。
子么程持么10秒么的尸么僵状(EXIT_ZOMBIE)——————————————————
#include
#include
#include
#include
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 #include
#include
#include
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 pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) >; 0)
printf(“child %d terminated\n”, pid);
return;
}
第二么方法,次两fork(),么么
在《Unix 么境高么么程》里么于么在个8.6么有非常楚的么明。清
么例
回么一下8 . 5么中有么死么程的么么。如果一么程要僵个fork一子么程~但不要求等待子么程么止~也不希望子么程么于死么直到父么程么止个它僵状~
么么么一要求的么么是么用fork两次。程序8 – 5么么了么一点。在第二子么程中么用个sleep以保么在打印父么程ID么第一子么程已么止。在个fork之后~
父、子么程都可么么么行我么无法么知一先么行。如果不使第二子么程睡眠~么——哪个会个
在fork之后~可能比其父么程先么行~于是打印的父么程它它ID将它是么建的父么程~而不是init么程;么程ID1,。#include
#include
#include “ourhdr.h”
int main(void)
{
pid_t pid;
if ( (pid = fork()) < 0)
err_sys(“fork error”);
else if (pid == 0) {
if ( (pid = fork()) < 0)
err_sys(“fork error”);
else if (pid > 0)
exit(0);
sleep(2);
printf(“second child, parent pid = %d\n”, getppid());
exit(0);
}
if (waitpid(pid, NULL, 0) != pid)
err_sys(“waitpid error”);
exit(0);
}
//avoid zombie process by forking twice
本文档为【什么是孤儿进程和僵尸进程.doc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。