原因
僵尸进程(Zombie Process)是指已经终止执行的子进程,但其父进程尚未调用wait()或waitpid()等系统调用来获取子进程的终止状态。在这种情况下,子进程的进程描述符仍然存在于系统进程表中,但它不再执行任何代码。僵尸进程会占用系统资源,包括进程ID和一些内核数据结构,如果大量的僵尸进程积累,可能会导致系统资源耗尽。
通常情况下,当子进程终止时,内核会向父进程发送一个SIGCHLD信号,父进程通过捕获这个信号并调用wait()或waitpid()来回收子进程的资源,包括终止状态和进程表中的条目。如果父进程没有处理这些终止的子进程,它们就会变成僵尸进程。
要避免僵尸进程的出现,父进程应该及时处理子进程的终止状态。这可以通过在父进程中调用wait()、waitpid()或捕获SIGCHLD信号来实现。通过及时回收子进程的资源,可以避免系统中出现大量僵尸进程,确保系统资源的有效利用。

解决办法
- 杀死父进程
- 父进程使用
wait() - 父进程处理
SIGCHILD信号 fork()两次,将子进程变成孤儿