使用代码模拟僵尸进程、孤儿进程

僵尸进程:

起因:子进程先于父进程退出,退出后为了保存自己的退出原因,因此资源没有被完全的释放,操作系统此时通知并且允许了父进程来接收这个返回值,但是如果父进程不管的话,这块资源就没有被完全的退出,处于僵死状态,称为僵尸进程
后果:资源泄露

 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 
  5 
  6 int main()
  7 {
  8     printf("**************%d\n",getpid());
  9     pid_t pid = fork();//创建子进程
 10     if(pid < 0)
 11     {
 12         printf("fork error\n");
 13         return -1;
 14     }
 15     else if(pid == 0)
 16     {
 17         //这段代码只有子进程能够运行到,因为在子进程中fork返回0
 18         printf("this is child!!--%d\n",getpid());
 19         sleep(5);
 20         exit(0);                                                                                                                                                                        
 21     }
 22     else if(pid > 0)
 23     {
 24         //这段代码只有父进程才能运行到
 25         printf("this is parent!---%d\n",getpid());
 26     }
 27     //下面的代码父子进程都有可能运行到
 28     while(1)
 29     {
 30         printf("-----------%d\n",getpid());
 31         sleep(1);
 32     }
 33 
 34     return 0;
 35 }

执行了zombie.c的代码之后,再看此时的进程过一会就变成了僵尸进程
在这里插入图片描述

孤儿进程:

来由:与僵尸进程相反,父进程先于子进程退出,这时候子进程就变成了一个孤儿进程(进程由一个前台进程变成了一个后台的进程),并且被1号进程收养。
如果是前台进程的话,我们在前台将无法输入命令,但是如果变成孤儿进程的话,就会变成后台的进程,依然可以运行

#include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 
  5 int main()
  6 {
  7     printf("*************\n");
  8     pid_t pid = fork();
  9     if(pid > 0)
 10     {
 11         sleep(5);
 12         exit(0);                                                                                                                                                                        
 13 
 14     }
 15     while(1)
 16     {
 17         printf("-----------\n");
 18         sleep(1);
 19     }
 20 
 21     return 0;
 22 }

下面就是孤儿进程的演示图:
前台依然可以输入命令,此时已经变成了后台的进程
在这里插入图片描述
在这里插入图片描述
这个时候,只能kill这个进程才可以退出
在这里插入图片描述
在这里插入图片描述
此时的父进程的pid变成了1,就是init进程
在这里插入图片描述

发布了149 篇原创文章 · 获赞 27 · 访问量 5050

猜你喜欢

转载自blog.csdn.net/qq_44783220/article/details/103015644