Linux进程(五):托孤

Linux进程(五):托孤


  在Linux进程中,若父进程先于子进程死亡,那么Linux内核将把子进程“托孤”给进程树为subreaper的进程,并由这个subreaper来负责该孤儿进程的“收尸过程”(清理 task_struct),若未找到subreaper进程,则该孤儿进程之间托付给init进程:

在这里插入图片描述

​   一个进程可以通过prctl这个系统调用把自己生命成一个subreaperPR_SET_CHILD_SUBREAPER是Linux3.4加入的新特性,把她设置为非零值,当前进程就会变成subreaper,会像1号进程那样收养孤儿进程:

/*Become reaper of our children*/
if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0){
    log_waring("Failed to make us a subreaper: %m");
    if (errno == EINVAL){
        log_info("Perhaps the kernel version is too old(<3.4:)");
    }
}

注:被声明为subreaper的进程会在pstree命令中被显示为一个init

int main(void)
{
    pid_t pid,wait_pid;
    int status;

    pid = fork();

    if (pid==-1)    {
        perror("Cannot create new process");
        exit(1);
    } else  if (pid==0) {
        printf("child process id: %ld\n", (long) getpid());
        pause();
        _exit(0);
    } else {
        printf("parent process id: %ld\n", (long) getpid());
        wait_pid=waitpid(pid, &status, WUNTRACED | WCONTINUED);
        if (wait_pid == -1) {
            perror("cannot using waitpid function");
            exit(1);
        }

        if(WIFSIGNALED(status))
            printf("child process is killed by signal %d\n", WTERMSIG(status));

        exit(0);
    }
}

​   在上述例子中,我们创造出一个子进程,父进程等待进程的结束,此时,我们如果将父进程杀掉,子进程将被托孤给pstree中显示的最近的init中。

运行程序,父进程创建子进程:

在这里插入图片描述

此时查看pstree

在这里插入图片描述

产生了两个a.out,若我们此时将父进程干掉,子进程的a.out将会被托孤至离他最近的init上。

]

所以在Linux操作系统中,不会存在真正的孤儿进程,因为所有的进程都会被托孤给init进程或subreaper

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值