孤儿进程实验
直接杀死父进程
//进入守护进程
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进程托管。
浙公网安备 33010602011771号