孤儿进程实验

直接杀死父进程

//进入守护进程
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

posted @   吃啊吃啊吃臭豆腐  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示