僵尸进程和孤儿进程

使用代码模拟实现僵尸进程, 孤儿进程的场景。

僵尸进程产生原因:

1. 子进程先于父进程退出。
2. 子进程退出为了保存自己的退出原因,因此这个退出后资源不会被完全释放,等待父亲进程来获取退出状态,然后释放进程所有资源。
3. 假如父进程没有关心子进程的退出,那么这个时候这个子进程将成为一个僵尸进程,占用着资源而不释放。

危害:资源泄露,正常进程可能无法创建

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
    pid_t pid=fork();
    if(pid<0)
    {   
        printf("error:%d\n",getpid());
        return -1; 
    }   
    else if(pid>0)
    {   
        printf("Parent is sleeping!:%d\n",getpid());
        sleep(50);//父进程处于可中断睡眠状态
			      //,无暇关注子进程的退出状态
    }   
    else
    {   
        printf("Child will exit!!:%d\n",getpid());
        exit(0);//子进程退出了
    }   
    return 0;
}

这里写图片描述
可以看到父进程的id是3646,子进程的id是3647,父进程处于S+(前台可中断睡眠状态),子进程处于Z+(前台僵尸进程状态)。当然父进程在睡够50秒之后还是会去接受子进程的死亡状态,释放子进程的资源,可以说我们模拟的僵尸进程是暂时僵尸,要是一直僵尸是很可怕的。

孤儿进程:

父进程先于子进程退出,那么子进程就成为了孤儿进程,这个孤儿将被孤儿院init进程领养。
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>

int main()
{
    uint64_t i = 0;

    int pid  = -1; 
    pid = fork();
    if (pid < 0) {
        return -1; 
    }else if (pid == 0) {
        printf("child:%d\n",pid);
        sleep(10);//子进程还在睡觉,它成了孤儿
    }   
    else{
        printf("parent%d\n",pid);
        sleep(1);
        exit(0);//父进程退出了
    }   
    while(1) 
    {   
        sleep(1);
    }   
    return 0;
}

这里写图片描述
父进程先于子进程退出,子进程被init进程(进程id为1的进程收养,有init进程对子进程进行资源回收)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值