一、僵死进程
- 设置僵死(zombie)状态的目的是维护子进程的信息,以便父进程在以后某个时候获取。 这些信息包括子进程的进程ID、终止状态以及资源利用信息(CPU时间、内存使用量等等)
- 如果一个进程终止,而该进程有子进程处于僵死状态,那么它的所有僵死子进程的父进程ID将被重置为1(init进程)。继承这些子进程的init进程将清理它们(也就是说init进程将wait它 们,从而去除它们的僵死状态)。有些Unix系统在ps命令输出的COMMAND栏以指明僵死进程
- 关于僵死进程还可以参阅:https://blog.csdn.net/qq_41453285/article/details/103738733
二、处理僵死进程
Signal(SIGCHLD, sig_chld); //这必须在fork第一个子进程之前完成,且只做一次
void sig_chld(int signo)
{
pid_t pid;
int stat;
pid = wait(&stat);
printf("child %d terminated\n", pid);
return;
}
备注
- 在信号处理函数中调用诸如printf这样的标准I/O函数是不合适的,其原因将在介绍“可重入函数”时讨论。我们在这里调用printf只是作为查看子进程何时终止的诊断手段
- 在System V和Unix 98标准下,如果一个进程把SIGCHLD的处置设定为SIG_IGN,它的子 进程就不会变为僵死进程。不幸的是,这种做法仅仅适用于System V和Unix 98,而POSIX明 确表示没有规定这样做。处理僵死进程的可移植方法就是捕获SIGCHLD,并调用wait或 waitpid