【发布时间】:2013-12-26 13:11:53
【问题描述】:
我试图守护进程,发现我们应该 fork() 两次。原因是如果进程是会话领导者,那么它可以控制 tty。我想知道,这个理论背后的基本原理是什么。
【问题讨论】:
标签: linux
我试图守护进程,发现我们应该 fork() 两次。原因是如果进程是会话领导者,那么它可以控制 tty。我想知道,这个理论背后的基本原理是什么。
【问题讨论】:
标签: linux
第一个分支是在单独的会话中运行守护进程。您应该为守护进程做的是(伪代码):
fork()
if (parent) {
return
else if (child) {
setsid();
closefds();
fork();
if (child) {
childwork();
} else {
exit(0);
}
}
setsid 调用将守护进程置于其自己的会话中,并将其与父进程的 tty 解除关联。如果您不进行setsid 调用,那么您将不会获得新会话,并且守护进程可能会受到它仍然属于的进程组的干扰 - 即它可能会受到HUP 发送的干扰到整个进程组。
第二个fork() 调用导致进程不再是会话领导者。这意味着如果进程打开一个未使用的终端设备(偶然或有意),它将无法获得控制终端,因为它不是会话领导者。如果它仍然是会话负责人,那么您必须确保所有打开终端设备的打开调用都必须使用 O_NOCTTY 调用以确保安全。
【讨论】: