您的位置:首页 > 其它

僵尸进程

2015-08-05 17:04 239 查看
概念

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程……

僵尸进程在系统内部的存在方式

进程调用exit,内核释放资源(打开的文件、占用的内存等)但是会保留一定的信息(进程号、退出状态、运行时间等)。父进程通过wait/waitpid获得子进程的这些状态,然后释放子进程保留的资源。

所以说极端的情况下,出现了大量的僵尸进程,那么进程号会被大量的占用,当系统所有进程号都被僵尸进程占用时,就无法创建新的进程了。

产生僵尸进程

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
pid_t child,grdson;

if((child=fork()) == 0) {
printf("child process id %d\n",getpid());
if((grdson=fork())==0) {
printf("grdson process id %d\n", getpid());
sleep(10);
exit(0);
}
else if(grdson > 0) {
exit(0);
}
else {
printf("fork grdson error.\n");
exit(0);
}

}
else if (child > 0) {
wait();
}
else
printf("fork() error\n");

sleep(60);
return 0;
}


View Code
执行以及查看结果:

XXXX> ./a.out
child process id 13479
grdson process id 13480
XXXX> ps -ef | grep a.out
1000     13478 19733  0 00:41 pts/2    00:00:00 ./a.out
1000     13480     1  0 00:41 pts/2    00:00:00 ./a.out
1000     13482 25700  0 00:41 pts/0    00:00:00 grep a.out


孙子进程13480由init进程领养了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: