僵尸进程和孤儿进程
##
zombie process
父进程没有退出,只是没有回收子进程结束时的状态信息(需要使用 wait
或 waitpid
),而 orphaned process
父进程已经先于子进程退出,此时 pid = 1 的 init
收养了子进程
而在父进程中显式指明忽略 SIGCHLD
可以将回收 zombie process
的工作交给 init
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_handler = SIG_IGN;
sa.sa_flags = 0;
sigaction(SIGCHLD, &sa, NULL);
如果已经显式指明忽略 SIGCHLD
,但是还有疑似僵尸进程存在,需要确认是否为僵尸进程(打印 ppid)
如果是僵尸进程,说明僵尸进程在此系统中通过这种方式回收不干净,在信号处理中调用 waitpid
进行回收
如果是孤儿进程,需要检查逻辑,为什么子进程不退出,或长时间执行