0%

僵尸进程和孤儿进程

僵尸进程和孤儿进程

##

zombie process 父进程没有退出,只是没有回收子进程结束时的状态信息(需要使用 waitwaitpid ),而 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 进行回收

如果是孤儿进程,需要检查逻辑,为什么子进程不退出,或长时间执行

Ref

  1. 孤儿进程与僵尸进程『总结』
  2. 浅议孤儿进程和僵尸进程(defunc)
  3. 子进程执行完成为僵尸进程,怎么解决