孤儿进程实验
直接杀死父进程
//进入守护进程
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);
}
代码含义,在守护进程中。创建子进程,随后杀死守护进程。
实验结果,子进程不会被杀死,成为了孤儿进程,被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;
}
实验结果,父进程被杀死后,子进程和子进程的子进程各自杀死。
孤儿进程
孤儿进程简单来说,是父进程因运行完毕、kill、奔溃后死亡,但是子进程仍然没有运行完毕的进程。会被init进程托管。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现