避免僵死进程实例
2011-03-31 19:14
176 查看
一个进程已经终止但其父进程尚未对其进行回收(获得终止子进程的有关信息,释放它占用的资源)的进程被称为僵死进程。
避免僵死进程的出现的一种办法是父进程调用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
避免僵死进程的出现的一种办法是父进程调用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
相关文章推荐
- 一个Linux守候进程例子,避免产生僵死进程
- 避免产生僵死进程
- apue 8-5调用fork两次以避免僵死进程
- linux僵死进程以及如何避免
- 如何避免僵死进程
- fork俩次以避免僵死进程
- linux僵死进程的产生与避免
- (转载)Linux僵死进程的产生与避免
- 【linux】——linux僵死进程的产生与避免
- linux僵死进程的产生与避免
- linux僵死进程的产生与避免
- 如何避免僵死进程。
- Unix进程控制之4---避免产生僵死进程
- 避免linux系统调用fork后产生僵死进程
- 避免僵死进程的方法
- Linux环境下僵死进程的产生及其避免
- linux避免僵死进程方法总结 http://blog.csdn.net/astrotycoon/article/details/39717143
- 调用fork两次以避免僵死进程
- 调用 fork() 两次以避免僵死进程
- 【进程线程与同步】5.2 避免在同一机器上运行同一程序的多个实例