在第一个场景中,进程调用setsid()
以启动新会话并成为其领导者,并调用open()
以连接到控制终端。然后会话负责人继续进行fork()
子进程,子进程将继承文件描述符到控制终端。
在第二种情况下,如果会话已经有多个进程但没有控制终端,然后领导者创建了与控制终端的连接,那么会话中的其他进程如何:
会话中的其他进程如何知道会话具有控制终端并且
他们如何将控制终端作为文件描述符打开?
感谢。
答案 0 :(得分:3)
控制终端在很多文档中被描述为整个会话的属性,但它实际上是每个单独进程的属性,它在fork
中从父对象继承。进程必须是会话负责人才能将自己附加到控制tty,但是任何进程都可以从其控制tty(如果有的话)与TIOCNOTTY
ioctl分离。因此,系统设置为处理会话中但未附加到控制tty的进程。
在你的“第二个场景”中,会话领导者在连接到控制tty之前分叉的进程 not 会随之附加到该tty。这意味着它们不完全是会话的一部分,就像从控制tty分离的进程不完全是会话的一部分一样:它们不能与tcsetpgrp
一起放到前台,它们无法打开/dev/tty
,如果控制tty挂断,则他们不会收到SIGHUP
等。另一方面,会话领导者在附加控制tty之后分叉的进程将像往常一样继承它
(作为一般规则,在Unix中,操纵调用进程的状态从不的操作对任何其他进程都有任何影响,即使它看起来应该如此;作为一般规则,当我们说这样的事情是在fork
上继承的时候,我们的意思是那条状态被复制到孩子身上,而不是在父母和孩子之间共享。一个重要的例外是“打开文件描述“s, 共享。如果你在一个分叉的进程中打开一个常规文件,并且子进程在其继承的文件描述符上调用lseek
,那么父进程将看到搜索指针移动。)