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

僵尸进程:

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

 #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进程
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值