直接回答:僵尸进程:子进程已退出,但父进程尚未调用 wait()/waitpid() 读取其退出状态,内核保留其进程表项(PID、退出码),状态为 Z(zombie)。孤儿进程:父进程先于子进程退出,子进程被 1 号进程(init/systemd)收养,由它负责后续回收。
展开解析:僵尸进程已死,不占用内存和 CPU,但占用进程表项;若父进程长期不回收且不停 fork,可能耗尽 PID 空间,所以大量僵尸是需要处理的故障信号。清除方法是杀死其父进程,让僵尸成为孤儿被 init 收养回收;kill -9 对僵尸无效,因为它本来就死了。孤儿进程本身无害,是正常机制——守护进程就利用它:fork 后父进程退出,使子进程脱离终端被 init 接管。区分两者的关键在"谁先死":僵尸是子死父不埋,孤儿是父死子被领养。追问方向:如何避免僵尸——父进程及时 waitpid()、在 SIGCHLD 处理函数中回收、或将 SIGCHLD 置为 SIG_IGN;双重 fork 创建守护进程的原理。