Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2052022
  • 博文数量: 610
  • 博客积分: 11499
  • 博客等级: 上将
  • 技术积分: 5511
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-12 19:27
文章分类

全部博文(610)

文章存档

2016年(5)

2015年(18)

2014年(12)

2013年(16)

2012年(297)

2011年(45)

2010年(37)

2009年(79)

2008年(101)

分类:

2012-06-15 14:46:31

     要创建僵尸进程首先得了解什么是僵尸进程,到底什么是僵尸进程呢?

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程……一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵尸进程(Zombie)的(系统调用exit,它的作用是 使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁),具体不多说了,大家可以收集有关资料以便更好理解僵尸进程。
     对于子进程,
如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态; 存在的问题:如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程,系统的性能可能会受到影响。我们就可以利用这一点产生僵尸进程,当然我们只是为了学习,而不是用它搞破坏的。下面我们在父进程中fork一个子进程,然后利用子进程再fork一个子进程,相当于有父、子、孙、三个进程。我们让父进程退出,不让子进程退出,于是令孙进程啥也没干先于子进程结束,这样孙进程就成为了一个僵尸进程了。
   下面是我写的一个生成僵尸进程的例子:

点击(此处)折叠或打开


  1. // zombie.c
  2. /*  create a zombie proess*/
  3. #include <sys/types.h>
  4. //#include <signal.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>

  7. int main()
  8. {
  9.     if(!fork()) { //create child proess
  10.     
  11.         if(fork()) { //child
  12.         
  13.             while(1) {
  14.                 sleep(5);
  15.             //    break;
  16.             }
  17.         }
  18.     }
  19.     return 0;
  20. }
编译生成其可执行文件zombie,即输入./zombie执行,然后在ps -ef 看看是否有字眼的进程。
如果害怕僵尸进程一直在内存,你可以kill其对应的父进程就行了。

阅读(1073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~