杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
如果子进程退出,父进程还没有执行到wait,那边子进程就会由变为短暂的僵尸进程,直到父进程执行到wait,然后被父进程处理。
当一个进程正常或异常终止的时候,内核就向其父进程发送SIGCHLD信号。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数。对于这种信号的系统默认动作是忽略它。
调用wait进程可能会发生的情况:
void sig_chld(int signo)
{
int pid;
if(signo == SIGCHLD) {
while((pid = wait(NULL)) > 0)//如果子进程还未退出父进程会阻塞在sighandler中
printf("process %d is exited\n",pid);
}
}
void sig_chld(int signo)
{
int pid;
if(signo == SIGCHLD) {
while((pid = waitpid(-1,NULL,WNOHANG) > 0)//暂时没有要处理的子进程就退出循环。
printf("process %d is exited\n",pid);
}
}
参考链接:
https:///qq739887227/article/details/82874309
https:///deniece1/article/details/102756586
https://www.cnblogs.com/nufangrensheng/p/3510101.html