一个进程已经终止但其父进程尚未对其进行回收(获得终止子进程的有关信息,释放它占用的资源)的进程被称为僵死进程。
避免僵死进程的出现的一种办法是父进程调用wait、waitpid等待子进程结束,但这样做有一个弊端就是在子进程结束前父进程会一直阻塞,不能做任何事情。另外一种更好的方法就是调用两次fork函数。
源代码如下:
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
int main(){
pid_t pid;
if((pid = fork()) < 0){ //创建子进程
perror("fork");
}else if(pid == 0){ //子进程1
if((pid = fork()) < 0){ //由子进程1创建子进程2
perror("fork");
}
else if(pid > 0){
exit(0); //子进程1结束
}
else{ //子进程2
sleep(2);
printf("second child,parent pid = %d/n",getppid()); //打印子进程2的父进程
exit(0);
}
}
else{ //父进程
/* do something else*/
}
}
因为子进程1创建完子进程2后退出,所以子进程2变成孤儿进程,自动被init进程收养。当子进程2结束时,init进程对子进程2进行了回收,避免了僵死进程的出现。其运行结果如下所示:
#./zomble
#second child,parent pid =1