孤儿进程实验

直接杀死父进程

//进入守护进程
int switchDaemon();
int main()
{
    switchDaemon();
    fork();
    fork();
    while (1);
    return 0;
}

int switchDaemon() {

    pid_t ret = fork();
    if (ret == -1) { return -1; }
    if (ret > 0) { exit(0); }

    ret = setsid();
    if (ret == -1) { return -2; }

    ret = fork();
    if (ret == -1) { return -3; }
    if (ret > 0) { exit(0); }

    umask(0);

    signal(SIGCHLD, SIG_IGN);
}

代码含义,在守护进程中。创建子进程,随后杀死守护进程。
image
实验结果,子进程不会被杀死,成为了孤儿进程,被Init进程托管。

子进程设置监听父进程死亡

prctl(PR_SET_PDEATHSIG, SIGHUP);

prctl()操纵调用线程或进程行为的各个方面。

PR_SET_PDEATHSIG
这是当父进程死亡时,调用进程将得到的信号。特别注意,这里的父进程指代创建该子进程的进程。
SIGHUP
挂断,相当于杀死自己。

int main()
{
    switchDaemon();
    fork();
    fork();
    prctl(PR_SET_PDEATHSIG, SIGHUP);
    while (1);
    return 0;
}

image
实验结果,父进程被杀死后,子进程和子进程的子进程各自杀死。

孤儿进程

孤儿进程简单来说,是父进程因运行完毕、kill、奔溃后死亡,但是子进程仍然没有运行完毕的进程。会被init进程托管。

参考链接:https://man7.org/linux/man-pages/man2/prctl.2.html

原文链接: https://www.cnblogs.com/tofu-ran/p/17133585.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    孤儿进程实验

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/319048

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月24日 下午3:09
下一篇 2023年2月24日 下午3:09

相关推荐