我试图守护一个进程,并且发现我们应该fork()两次。原因是如果该过程是会话领导者,那么它可以控制tty。我想知道,这个理论背后的理由是什么。
答案 0 :(得分:2)
第一个分支是在一个单独的会话中运行守护进程。您希望为守护进程做的是(伪代码):
fork()
if (parent) {
return
else if (child) {
setsid();
closefds();
fork();
if (child) {
childwork();
} else {
exit(0);
}
}
setsid
调用将守护进程放入其自己的会话中,并将其与父进程的tty取消关联。如果你没有进行setsid
调用,那么你就不会得到新的会话,守护进程可能会受到它仍然属于的进程组的干扰 - 即它可能受到{{{{1}的干扰。 1}}发送到整个流程组。
第二次HUP
调用导致该进程不再是会话负责人。这意味着如果进程打开未使用的终端设备(无论是意外还是故意),进程将无法获取控制终端,因为它不是会话负责人。如果它仍然是会话领导者,那么您必须确保打开终端设备的所有打开的呼叫都必须使用fork()
进行调用以确保安全。