版权声明:本文为博主原创文章,欢迎转载,转载请声明出处! https://blog.csdn.net/hansionz/article/details/82829587
一.僵尸进程
1.什么是僵尸进程(zombie)
当子进程退出
并且父进程没有读取到子进程退出的返回代码时
就会产生僵尸进程。僵尸进程会以终止状态
保持在进程中,并且会一直在等待父进程读取退出状态代码
。因此只要子进程退出
,父进程还在运行但是父进程没有读取子进程状态
,子进程进入Z状态。
2.一个维持30秒僵尸进程的例子
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<unistd.h>
4 #include<stdlib.h>
5
6 int main()
7 {
8 pid_t id=fork();
9 if(id<0){
10 perror("use fork");
11 exit(1);
12 }
13 else if(id==0){//child
14 printf("child[%d] is begin Z...\n",getpid());
15 sleep(5);
16 exit(0);
17 }
18 else{//parent
19 printf("parent[%d] is sleeping...\n",getpid());
20 sleep(30);
21 }
22 return 0;
23 }
运行结果如下:
3.僵尸进程的危害
子进程的退出状态会一直被维持下去
,维护退出状态本身就是要用数据维护
,也属于进程基本信息,被保存在task_struct
中。也就是说只要Z状态不退出
,那么PCB要一直维护退出信息
。如果一个父进程创建了很多的子进程,都不进行回收,就会造成内存资源的极大浪费
,也会造成内存泄露
。
二.孤儿进程
1.什么是孤儿进程
父进程提前退出
,子进程
就称为“孤儿进程”
。一旦父进程退出
,子进程要退出的时候就是Z状态
,因为没有进程接收它的退出信息
,所以孤儿进程要被1号init进程领养回收
,从而避免子进程变为僵尸进程。
2.一个例子说明孤儿进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t id=fork()
if(id<0){
perror("use fork");
exit(1);
}
else if(id==0){//child
printf("I am child,pid is [%d],My parent is[%d]\n",getpid(),getppid());
sleep(10);
}
else{//parent
printf("I am parent ,pid is [%d]\n",getpid());
sleep(2);
exit(0);
}
return 0;
}