我试图守护进程,发现我们应该 fork() 两次。原因是,如果进程是 session 领导者,那么它可以控制 tty。我想知道,这个理论背后的基本原理是什么。
最佳答案
第一个分支是在单独的 session 中运行守护进程。您应该为守护进程做的是(伪代码):
fork()
if (parent) {
return
else if (child) {
setsid();
closefds();
fork();
if (child) {
childwork();
} else {
exit(0);
}
}
setsid
call 将守护进程置于它自己的 session 中,并将它与父进程的 tty 解除关联。如果您不执行 setsid
调用,那么您不会获得新 session ,并且守护进程可能会受到它仍然属于的进程组的干扰 - 即它可能会受到干扰HUP
发送给整个进程组。
第二次 fork()
调用导致进程不再是 session 领导者。这意味着如果进程打开未使用的终端设备(无意或有意),则进程将无法获得控制终端,因为它不是 session 领导者。如果它仍然是 session 领导者,那么为了安全起见,您必须确保必须使用 O_NOCTTY
调用所有打开终端设备的打开调用。
关于linux - session 负责人如何在 Linux 中控制 tty?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20785486/