僵尸进程 在类UNIX系统中僵尸进程是指完成执行通过exit系统调用或运行时发生致命错误或收到终止信号所致但在操作系统的进程表中仍然存在其进程控制块处于终止状态英语Process stateTerminated的进程这发生于子进程需要保留表项以允许其父进程读取子进程的退出狀態一旦退出态通过wait系统调用读取僵尸进程条目就从进程表中删除称之为回收reaped正常情况下进程直接被其父进程wait并由系统回收进程长时间保持僵尸状态一般是错误的并导致资源泄漏 英文术语zombie process源自喪屍不死之人隐喻子进程已死但仍然没有被回收与正常进程不同kill命令对僵尸进程无效孤儿进程不同于僵尸进程其父进程已经死掉但孤儿进程仍能正常执行但并不会变为僵尸进程因为被init进程ID号为收养并wait其退出 子进程死后系统会发送SIGCHLD信号给父进程父进程对其默认处理是忽略如果想响应这个消息父进程通常在信号事件处理程序中使用wait系统调用来响应子进程的终止 僵尸进程被回收后其进程号与在进程表中的表项都可以被系统重用但如果父进程没有调用wait僵尸进程将保留进程表中的表项导致了资源泄漏某些情况下这反倒是期望的父进程创建了另外一个子进程并希望具有不同的进程号如果父进程通过设置事件处理函数为SIGIGN显式忽略SIGCHLD信号而不是隐式默认忽略该信号或者具有SANOCLDWAIT标志所有子进程的退出状态信息将被抛弃并且直接被系统回收 UNIX命令ps列出的进程的状态STAT栏标示为 Z则为僵尸进程 收割僵尸进程的方法是通过kill命令手工向其父进程发送SIGCHLD信号如果其父进程仍然拒绝收割僵尸进程则终止父进程使得init进程收养僵尸进程init进程周期执行wait系统调用收割其收养的所有僵尸进程 为避免产生僵尸进程实际应用中一般采取的方式是 将父进程中对SIGCHLD信号的处理函数设为SIGIGN忽略信号 fork两次并杀死一级子进程令二级子进程成为孤儿进程而被init所收养清理