Linux并不把进程的树形结构导出给普通用户,然而在内核中,它却使用树形结构来管理进程。linux内核使用“子进程退出,父进程收尸,父进程退出,子进程被过继” 这种方式来管理进程的死亡,然而却少了一种,那就是父进程不给子进程收尸的情况 ,这就是僵尸进程的原因。
既然知道了僵尸进程为何产生,那么想干掉它们就简单了。记住:任何没有人为因素的纯技术问题都是可以解决的!如何操作呢?很简单,就三步:
1.将僵尸进程从树形进程组织中摘除;
2.将僵尸进程过继给一个特定的进程;
3.该特定进程调用wait来回收掉它。
这三步岂不是很麻烦,直接干掉它的父进程不就得了,这样内核会自己将僵尸进程过继给别的进程或者init进程,然而有时我们不能这么做,如果它的父进程是个很重要的进程咋办,我们不能因为父辈抛弃了过早去世的孩子而责怪父亲,如果那样,linux内核的法律岂不是比我们还严重...既然父亲不要孩子了,那么建立一个收容所是必要的,使用上述三个步骤完成子进程空壳的过继和回收!这个收容所可以在内核空间也可以在用户空间,这不是最重要的。本文给出了一个预研例子:
1.首先给出一个用户态进程代码:
#include <unistd.h> int main() { int pid = 0; pid = fork(); if (pid == 0) { //子进程将瞬间变成僵尸,因为:1.父进程不回收;2.父进程不忽略 } else { while (1) { //I'm VIP,though I am always sleeping! sleep(1); } } }
#include <unistd.h> int main() { int pid = 0; pid = fork(); if (pid == 0) { //子进程将瞬间变成僵尸,因为:1.父进程不回收;2.父进程不忽略 } else { while (1) { //I'm VIP,though I am always sleeping! sleep(1); } } } 2.然后给出一个内核模块代码: