僵尸进程和孤儿进程
##
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 进行回收
如果是孤儿进程,需要检查逻辑,为什么子进程不退出,或长时间执行