孤儿进程与僵尸进程

孤儿进程与僵尸进程


<1>孤儿进程
概念:父进程已经退出,只剩子进程,所以子进程变成孤儿进程,init进程变成孤儿进程的父进程;目的是为了释放用户区空间,自己释放不了PCB,需要由父进程来释放。
这个需要我们使用代码来验证一下:
产生孤儿进程最简单的方法就是:让父进程提前结束进程,所以让子进程sleep(1),保证父进程先结束进程。

  1 #include<stdio.h>                                                           
  2 #include<unistd.h>
  3 
  4 int main()
  5 {
  6     pid_t pid=fork();
  7     if(pid == 0)
  8     {
  9         sleep(1);
 10         printf("child pid=%d,ppid=%d\n",getpid(),getppid());
 11     }
 12     else if(pid>0)
 13     {
 14         printf("=========parent\n");
 15         printf("pid=%d,ppid=%d\n",getpid(),getppid());
 16     }
 17     return 0;
 18 }

结果是:

=========parent
pid=3480,ppid=3409
wz@wz-machine:~/linux$ child pid=3481,ppid=2065

从上面的结果可知,子进程中的父进程ID不是父进程的ID,所以进程是孤儿进程,那么ID是谁的?我们用ps-ef 来看一下:

 2065  1508  0 21:58 ?        00:00:00 init --user

由此可以知道,孤儿进程最后是被init进程回收掉了。


<2>僵尸进程
概念:就是子进程退出,但是父进程还在,父进程不去释放进程的PCB,子进程就变成僵尸进程;退出方法,杀死父进程。
同样,用程序去验证法一下:

 1 #include<stdio.h>                                                                                       
  2 #include<unistd.h>
  3 
  4 int main()
  5 {
  6     pid_t pid;
  7     pid = fork();
  8     if(pid < 0)
  9     {
 10         printf("error\n");
 11     }
 12     else if(pid == 0)
 13     {
 14         printf("son:pid=%d\n",getpid());
 15     }
 16     else
 17     {
 18         while(1)
 19         {
 20             printf("**************father************\n");
 21             printf("pid:%d\n",getpid());
 22         }
 23 
 24     }
 25     return 0;
 26 }         

结果:

··························
pid:3677
**************father************
pid:3677
**************father************
pid:3677
**************father************
pid:3677
**************father************
·······························

我们用ps-aux查看一下:

3706 15.5  0.0   2028   280 pts/0    R+   23:00   0:11 ./jiangshi1
3707  0.0  0.0      0     0 pts/0    Z+   23:00   0:00 [jiangshi1] <defunct>

由此可知,产生僵尸进程,我们可以使用kill -9 3706 的办法杀死僵尸进程。
结果:

pid:3706
**************father************已杀死

总结:这就是我们经常会遇到的两种进程,孤儿进程和僵尸进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值