会话领导者如何在Linux中控制tty?

时间:2013-12-26 13:11:53

标签: linux

我试图守护一个进程,并且发现我们应该fork()两次。原因是如果该过程是会话领导者,那么它可以控制tty。我想知道,这个理论背后的理由是什么。

1 个答案:

答案 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()进行调用以确保安全。