要创建僵尸进程首先得了解什么是僵尸进程,到底什么是僵尸进程呢?
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程.
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,
看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程……一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵尸进程(Zombie)的(系统调用exit,它的作用是 使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁),具体不多说了,大家可以收集有关资料以便更好理解僵尸进程。
对于子进程,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态;
存在的问题:如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程,系统的性能可能会受到影响。
我们就可以利用这一点产生僵尸进程,当然我们只是为了学习,而不是用它搞破坏的。下面我们在父进程中fork一个子进程,然后利用子进程再fork一个子进程,相当于有父、子、孙、三个进程。我们让父进程退出,不让子进程退出,于是令孙进程啥也没干先于子进程结束,这样孙进程就成为了一个僵尸进程了。
下面是我写的一个生成僵尸进程的例子:
- // zombie.c
- /* create a zombie proess*/
- #include <sys/types.h>
- //#include <signal.h>
- #include <unistd.h>
- #include <stdlib.h>
- int main()
- {
- if(!fork()) { //create child proess
-
- if(fork()) { //child
-
- while(1) {
- sleep(5);
- // break;
- }
- }
- }
- return 0;
- }
编译生成其可执行文件zombie,即输入./zombie执行,然后在ps -ef 看看是否有
字眼的进程。
如果害怕僵尸进程一直在内存,你可以kill其对应的父进程就行了。
阅读(1073) | 评论(0) | 转发(0) |