僵尸进程和孤儿进程

Linux下进程的状态:
1.R ( running ) 可执行行态。
2.S ( sleeping ) 可中断睡眠态。
3.D (disk sleep)不可中断的睡眠,也叫硬盘睡眠。
4.T (Stop)暂停或跟踪状态。
5.X (Dead)即将被销毁。
6.Z (zombie)僵尸状态,等待回收资源。
僵尸状态:
当一个进程退出时,它并不是完全消失,而是等到它的父进程通过调用wait()系统调用来回收该子进程的退出状态和资源,在这个等待的过程中进程处于僵死状态。
以下代码来制造僵尸进程:

#include<unistd.h>
  2 #include<stdio.h>
  3 #include<error.h>
  4 #include<stdlib.h>
  5 int main()
  6 {
  7     pid_t pid=fork();
  8     if(pid<0)
  9     {
 10         perror("fork");
 11     }
 12     else if(pid==0)
 13     {
 14         //child
 15         printf("child: pid=%d, ppid=%d \n ",getpid(),getppid());
 16         exit(0);//退出子进程
 18     }
 19     else{
 20         //father
 21         printf("father: pid=%d ,ppid=%d \n ",getpid(),getppid());
 22     }
 23     sleep(5);//睡眠五秒后退出
 24     system("ps -l");
 25     return 0;
 26 }

输出结果为:
这里写图片描述
子进程变成僵尸进程,等待父进程回收。
孤儿进程:
如果在这个期间,父进程退出了,并没有回收子进程的资源和状态,那么该子进程会变成孤儿进程,最终会被1号进程,也就是init进程收养。其次init会定期来调用wait()来完成僵尸进程的回收。
程序为以下:

 #include<unistd.h>
  2 #include<stdio.h>
  3 #include<error.h>
  4 #include<stdlib.h>
  5 int main()
  6 {
  7     pid_t pid=fork();
  8     if(pid<0)
  9     {
 10         perror("fork");
 11     }
 12     else if(pid>0)
 13     {
 14         //father
 15         printf("father: pid=%d, ppid=%d \n ",getpid(),getppid());
 16     sleep(1);//睡眠一秒 打印pid
 17     exit(1);//退出父进程,让子进程变为孤儿进程
 18     }
 19     else{
 20         //child
 21         printf("child: pid=%d ,ppid=%d \n ",getpid(),getppid());
 22         sleep(5);//睡眠5s 后退出
 23     }
 24     system("ps -l");
 25     return 0;
 26 }

父进程先退出,子进程变为孤儿进程被init领养(1号进程)。
这里写图片描述
注意:僵尸进程太多,无法回收会导致系统资源被占用太多,从而系统消耗太大而奔溃。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值