Linux 僵尸进程与孤儿进程

僵尸进程

产生原因

子进程先于父进程退出,他要保留退出原因在pcb中,因此退出后不会自动释放所有资源,子进程退出后操作系统会通知父进程,子进程退出了,去获取一下原因,然后完全释放子进程资源,假如父进程不管子进程的退出状态,那么这个子进程将进入僵死状态,成为僵尸进程

代码实现僵尸进程
//该程序为20秒的僵尸进程,在第10秒时变为僵尸进程,30秒时退出

  #include <stdio.h>
  #include <unistd.h>
  #include <errno.h>
  #include <stdlib.h>
  
  int main()
  {
     pid_t pid = fork();//创建子进程
  
     if (pid < 0)//fork返回值小于零时是创建出错
     {
         perror("fork error");
         return -1;
     }
     else if(pid == 0)//fork返回值为零时,是在子进程中
     {
         printf("this is child!!\n");
         sleep(10);
         exit(EXIT_SUCCESS);
     }
     else//在父进程中,fork的返回值是创建出的子进程的pid
     {
         printf("this is parent!!\n");
         sleep(20);
     }
 
     return 0;
 }

此图是在程序运行10秒内的进程信息,可以看出父子进程此时都是S状态,也就是睡眠态
在这里插入图片描述
此图是程序运行10秒后到20秒内的进程信息,此时的父进程还是睡眠状态,而子进程已经变为僵尸态,此时的父进程就是僵尸进程在这里插入图片描述

孤儿进程

产生原因

父进程先于子进程退出

此时父进程变为init进程,也就是说,父进程退出了,init进程将负责释放资源,init进程非常负责任,因此,孤儿进程不会成为僵尸进程

代码实现
  #include <stdio.h>
  #include <unistd.h>
  #include <errno.h>
  
  int main()
  {
      pid_t pid = fork();
  
      if (pid < 0)
      {
          perror("fork error");
          return -1;
      }
      else if (pid > 0)
      {
          printf("parent %d\n", getpid());
          return 0;
      }
      else
      {
      	  sleep(30);
      }
     
      return 0;
  }

在这里插入图片描述
此图为10秒前,此时未成为孤儿进程,父进程pid为4764,子进程pid为4765
在这里插入图片描述
从上图中可以看出父进程已经退出了,pid为4765的进程其父进程的pid为1,也就是其父进程变为init进程,此时已经成为孤儿进程,最终init进程在子进程结束后将负责释放其资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值