僵尸进程
什么是僵尸进程?
-僵尸状态是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。
-僵尸进程会终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
-所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4
5
6 int main()
7 {
8 pid_t pid=fork();
9 if(pid>0)
10 {
11 while(1)
12 {
13 sleep(1);
14 printf("我的儿子在哪里\n");
15 }
16 }
17 else if(pid==0){
18 sleep(10);
19 printf("我凉了\n");
20 }
21 else{
22 perror("error");
23 exit(1);
24 }
25 }
从上图我们可以看出,10秒之后子进程退出,进入Z状态,父进程成为僵尸进程
僵尸进程的危害:
1.进程的退出状态必须维持下去,可父进程如果一直不读取,那么子进程一直处于Z状态。
2.维持退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB要一直维护。
3.父进程创建很多子进程,不回收,就会造成内存资源的浪费。
4.内存泄漏。
孤儿进程
什么是孤儿进程?
-父进程如果提前退出,那么子进程后退出,进入Z之后,子进程就被称为孤儿进程。
-孤儿进程被1号init进程领养,当然要有init进程 回收。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4
5 int main()
6 {
7 pid_t pid=fork();
8 if(pid==-1)
9 {
10 perror("error");
11 exit(1);
12 }
13 else if(pid>0){
14 printf("father is pid:%d child is pid: %d\n",getppid(),getpid());
15 exit(2);
16 }
17 else{
18 sleep(3);
19 printf("child is pid:%d ppid:%d\n",getpid(),getppid());
20 exit(3);
21 }
22 }
从图中我们可以看出父进程退出之后,子进程被1号收养,父id为1.