僵尸进程(zombie process)

首先了解一下linux中进程的5大状态:


R        Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
D Uninterruptible sleep (usually IO)
T Stopped, either by a job control signal or because it is being traced.
Z Defunct ("zombie") process, terminated but not reaped by its parent.

状态转换关系图:

               

 

僵尸进程是指一个已经结束运行,但是其父进程尚未对其进行善后处理的进程。那么为什么一个进程结束运行之后,父进程要对它进行善后处理呢?善后处理做了什么事呢?

具体来说就是,一个进程结束运行之后,该进程并没有被彻底销毁,内核仍然为该进程维护了一些信息(进程ID、该进程的终止状态以及该进程使用的CPU时间总量)。父进程可以通过调用wait()/waitpid()来获取这些信息,并最终销毁该进程。

如何避免僵尸进程的产生呢?

1. 父进程通过调用wait()/waitpid()等待子进程结束。(这会导致父进程被挂起)

2. 如果父进程很忙,不想被挂起,可以通过signal函数设置SIGCHLD信号的handler,在handler中调用wait()/waitpid()。

      (子进程结束时,内核会向父进程发送SIGCHLD信号,父进程对该信号的默认处理是忽略。)

3. 父进程通过signal(SIGCHLD, SIG_IGN)显示忽略SIGCHLD信号,这样子进程结束后,内核不在向父进程发送SIGCHLD信号,内核负责回收子进程。

4. 两次fork()。

    父进程fork()出子进程,子进程fork()出孙进程后退出,孙进程结束运行后,由于其父进程已经退出,因此由init进程接管。init进程会负责该进程的销毁工作。

如何清除僵尸进程呢?

    kill命令无法杀死僵尸进程,但是我们可以kill僵尸进程的父进程,这样僵尸进程就会变成孤儿进程,然后由init进程接管。

 

posted @ 2015-08-13 19:21  Sawyer Ford  阅读(575)  评论(0编辑  收藏  举报