进程——孤儿进程 僵尸进程

孤儿进程

概念:
父进程先于子进程退出
子进程没有父进程获取自身的退出状态,也就变成了孤儿进程
但是,所有的孤儿进程都被一号(init)进程所收养,由一号进程作为所有孤儿进程的父进程,负责孤儿进程的资源释放
产生孤儿进程代码:

 #include<stdio.h>                                                                                                 
 #include<unistd.h>                                                                                                                                                                                                                 
 int main()                                                                                                        
 {                                                                                                                 
	 pid_t pid = fork();                                                                                             
	 if(pid < 0){                                                                                                    
	     perror("fork");                                                                                               
	 }                                                                                                            
	 else if(pid == 0){                                                                                              
	 	 printf("child  pid = %d, ppid = %d\n", getpid(), getppid());                                               
		 sleep(8);                                                                                                     
		 printf("child  pid = %d, ppid = %d\n", getpid(), getppid());                                                  
	 }                                                                                                               
	 else{                                                                                                           
	    sleep(3);                                                                                                     
	    printf("father  pid = %d, ppid = %d\n", getpid(), getppid());                                                 
	 }                                                                                                               
	 return 0;                                                                                                       
 }

在这里插入图片描述

分析:首先让父进程睡眠3秒,那么子进程打印出第一句之后,进入8秒的休眠期,此时子进程的父进程id我们可以看到是父进程的id,三秒之后,父进程退出(孤儿进程形成条件) 8秒之后,子进程退出时,可以看到它的父进程id已经变成了 1, 也就是说明孤儿进程会被一号进程所领养!
:孤儿进程在系统后台运行

僵尸进程

概念:
由于子进程先于父进程退出,
子进程退出时,为了保存自己的退出状态,等待父进程获取自己的退出状态,释放子进程资源
但是由于父进程并没有关心子进程退出,导致子进程一直占用着系统资源,不释放,直到父进程读取子进程退出状态
也就导致子进程变成了僵尸进程

产生僵尸进程代码:

 #include<stdio.h>                                                                                                 
 #include<unistd.h>                                                                                                                                                                                                                 
 int main()                                                                                                        
 {                                                                                                                 
	 pid_t pid = fork();                                                                                             
	 if(pid < 0){                                                                                                    
	     perror("fork");                                                                                               
	 }                                                                                                            
	 else if(pid == 0){                                                                                                                                          
		 sleep(2);                                                                                                     
		 printf("child  pid = %d, ppid = %d\n", getpid(), getppid());                                                  
	 }                                                                                                               
	 else{                                                                                                           
	    sleep(5);                                                                                                     
	    printf("father  pid = %d, ppid = %d\n", getpid(), getppid());                                                 
	 }                                                                                                               
	 return 0;                                                                                                       
 }

在这里插入图片描述

分析:
我们可以由代码和图片,可以知道,在前两秒时间里,子进程和父进程同时处于运行状态,当两秒之后子进程退出,此时父进程还未退出,未获取子进程的退出状态,形成了产生僵尸进程的条件,结果可以看到,在此状态下,子进程的状态变为Z,也就是僵尸状态,知道父进程也退出之后,其退出状态才被父进程获取,从而结束掉父子两个进程!

thanks!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值