在第一种情况下,进程调用setsid()
开始一个新 session 并成为其领导者,并调用open()
连接到控制终端。然后 session 负责人继续 fork()
子进程,子进程将文件描述符继承到控制终端。
在第二种情况下,如果一个 session 已经有多个进程但没有控制终端,然后领导者创建一个到控制终端的连接,那么 session 中的其他进程呢:
session 中的其他进程如何知道 session 有一个控制终端和
他们如何将控制终端作为文件描述符打开?
谢谢。
最佳答案
控制终端在很多文档中被描述为整个 session 的属性,但它实际上是每个单独进程的属性,在 fork
中从父进程继承到子进程。进程必须是 session 领导者才能将自己附加到控制 tty,但任何进程都可以使用 TIOCNOTTY
ioctl 从其控制 tty 中分离出来(如果有的话)。因此系统设置为处理 session 中但未附加到控制 tty 的进程。
在您的“第二个场景”中, session 负责人在附加到控制 tty 之前 fork 的进程不会与其一起附加到该 tty。这意味着它们不完全是 session 的一部分,就像已经脱离控制 tty 的进程不完全是 session 的一部分一样:它们不能用 tcsetpgrp
放在前台>,它们无法打开 /dev/tty
,如果控制 tty 挂断,它们不会收到 SIGHUP
,等等。 session 领导者在附加控制后派生的进程另一方面,tty 将像往常一样继承它。
(作为一般规则,在 Unix 中,操纵调用进程状态的操作从不对任何其他进程有任何影响,即使它们看起来应该如此;同样作为一般规则,当我们说某某通过 fork
继承时,我们的意思是状态片被复制到子进程中,而不是在父进程和子进程之间共享。一个重要的异常(exception)是“打开文件描述, 是共享的。如果您在 fork 的进程中打开一个常规文件,并且子进程对其继承的文件描述符调用 lseek
,则父进程将看到搜索指针移动。)
关于c - session 中的现有进程将如何了解和获取 session 领导者刚刚获取的控制终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649796/