孤儿进程与僵尸进程
<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************已杀死
总结:这就是我们经常会遇到的两种进程,孤儿进程和僵尸进程。