僵尸进程
-
什么是僵尸进程
一个已经终止、但是其父进程尚未对其进行善后处理(获取进程终止信息、释放它仍占用的资源)的进程称为僵死进程。 —— APUE(中文版)P189
-
什么时候会产生僵尸进程
如果子进程终止了, 但是父进程运行时间较长, 甚至一直在循环, 不回收子进程信息, 这个时候系统内的僵尸进程就会越来越多。
-
怎么去掉或防止产生僵尸进程
-
说去掉僵尸进程而不是杀死僵尸进程的原因也是为什么僵尸进程杀不死的原因, 僵尸进程无法使用kill -9杀死, 因为它已经死了…
-
去掉僵尸的方法当然是善后处理了, 如果父进程调用了wait等回收子进程信息的系统调用, 这个时候就会回收僵尸进程。
-
杀死父进程, 如果父进程死掉了, 这个时候僵尸进程会交给init进程处理, 系统会自动回收所有僵尸进程。
-
父进程设置忽略sigchld信号(
signal(SIGCHLD, SIG_IGN);
), 当子进程终止的时候会向父进程发送sigchld信号, 如果该进程忽略了该信号,那么就代表不关心进程信息, 这个时候操作系统回收子进程的资源。 -
fork两次, 然后回收子进程, 孙子进程处理本该子进程处理的事情, 这个时候孙子进程就成了孤儿进程, 那么孙子进程的父进程就变成了init进程, 当它结束的时候系统自动回收资源。
-
-
如何查看僵尸进程
ps命令, 例如ps -aux
注意输出的第二行, 有个defunct, 第二行这个进程就是个僵尸进程。 stat为Z。