演示僵尸进程的形成

2018-06-07 分类:实用技能 阅读(2606) 评论(0)

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

 

从系统角度来说,处理僵尸进程有两种方法:

 

1 找到僵死进程的父进程,kill掉父进程,那么僵死进程将变为孤儿进程,孤儿进程在系统中由init进程接管,init进程将回收僵死进程的资源

2 reboot系统,因为僵死进程是不可以被kill掉

 

为了模拟僵尸进程,特找到如下C语言的源代码

vi zombia.c

#include <sys/types.h>

#include <sys/wait.h>

#include <errno.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

 

 

int main(int argc, char *argv[])

{

pid_t pid;

 

pid = fork();

if (pid == 0) {

 

int iPid = (int)getpid();

fprintf(stderr,"I am child,%d\n",iPid);

sleep(1);

fprintf(stderr, "Child exits\n");

 

return EXIT_SUCCESS;

}

int iPid = (int)getpid();

fprintf(stderr,"I am parent,%d\n",iPid);

fprintf(stderr, "sleep....\n");

sleep(120);

fprintf(stderr, "parent exits\n");

return EXIT_SUCCESS;

}

保存退出:wq!

 

使用gcc编译(没有gcc命令,自行安装)

gcc zombia.c

编译完成可以看到有一个a.out

 

执行./aout输出如下

[root@m03 ~]# ./a.out

I am parent,23217

sleep....

I am child,23218

Child exits

 

这时候top查看存在一个僵尸进程

ps -ef找到父进程23217

从上图可以看出无论怎么kill子进程23218,都已经杀不死了。

 

僵尸进程测试完毕!

评论已关闭

登录

忘记密码 ?

切换登录

注册