孤儿进程和僵尸进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程即1号进程收养,并由init进程进行管理。

僵尸进城:如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息。这种进程称之为僵死进程。

我们通过代码实现并且查看着两个进程

孤儿进程:

#include<stdio.h> 
#include<stdlib.h>   
int main()
{
	pid_t id=fork();    
	if(id>0)  
	{
		sleep(1);    
		printf("father:%d,%d\n",getpid(),getppid());  
	}     
	else if(id==0)     
	{
		sleep(6);  
		printf("child:%d,%d\n",getpid(),getppid()); 
		exit(0);     
	} 
	else
	{
		perror("fork");
	}
	return 0;  
} 

僵尸进程:

#include<unistd.h>  
#include<stdio.h>  
#include <errno.h>  
#include <stdlib.h>   
int main()
{
	pid_t pid;      
	pid = fork();     
	if (pid <0)     
	{
		perror("fork error:");          
		exit(1);   
	}   
	else if (pid == 0)    
	{
		printf("I am child process.I am exiting.[%d][%d]\n",getpid(),\
				getppid());
		exit(0);       
	}  
	printf("I am father process.[%d]\n",getpid());     
	//等待子进程先退出    
	sleep(2);     
	//输出进程信息     
	system("ps -o pid,ppid,state,tty,command");     
	printf("father process is exiting.\n");   
	
	return 0;
}

如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号和进程资源而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。    

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个孤儿院,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

4.解决方法

(1)通过信号机制

  子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。

(2)fork两次
  原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值