什么是僵尸进程?
当子进程(child process)先于父进程(parent process)退出,但是父进程没有调用wait/waitpid回收子进程的资源,则子进程变成僵尸进程。
但是如果该进程的父进程已经结束,那该进程就不会变成僵尸进程,因为每个进程结束的时候,系统会扫描所有运行中的进程,看看有没有哪个进程是刚
刚结束的进程的子进程,如果有就由Init来接管他,成为他的父进程。
危害?
如果父进程不调用wait/waitpid,则子进程的保留信息不会被释放,造成内核资源的无法回收,同时进程号会一直被占用,系统所能使用的进程号是
有限的,大量地产生僵尸进程将会导致系统不能产生新的进程。
怎么避免僵尸进程?
防止的办法是当父进程fork一个子进程后,必须通过wait/waitpid等函数等待子进程结束,但这会导致父进程挂起,所以通常的做法是用signal函数为
SIGCHLD安装handler,在handler函数中调用wait/waitpid函数进行回收。