会话中的现有流程如何了解和获取刚刚由会话负责人获取的控制终端?

时间:2018-06-01 19:15:58

标签: c linux terminal process

在第一个场景中,进程调用setsid()以启动新会话并成为其领导者,并调用open()以连接到控制终端。然后会话负责人继续进行fork()子进程,子进程将继承文件描述符到控制终端。

在第二种情况下,如果会话已经有多个进程但没有控制终端,然后领导者创建了与控制终端的连接,那么会话中的其他进程如何:

  • 会话中的其他进程如何知道会话具有控制终端并且

  • 他们如何将控制终端作为文件描述符打开?

感谢。

来自https://unix.stackexchange.com/questions/446207/for-a-process-what-are-the-differences-between-a-controlling-terminal-and-non-c

1 个答案:

答案 0 :(得分:3)

控制终端在很多文档中被描述为整个会话的属性,但它实际上是每个单独进程的属性,它在fork中从父对象继承。进程必须是会话负责人才能将自己附加到控制tty,但是任何进程都可以从其控制tty(如果有的话)与TIOCNOTTY ioctl分离。因此,系统设置为处理会话中但未附加到控制tty的进程。

在你的“第二个场景”中,会话领导者在连接到控制tty之前分叉的进程 not 会随之附加到该tty。这意味着它们不完全是会话的一部分,就像从控制tty分离的进程不完全是会话的一部分一样:它们不能与tcsetpgrp一起放到前台,它们无法打开/dev/tty,如果控制tty挂断,则他们不会收到SIGHUP等。另一方面,会话领导者在附加控制tty之后分叉的进程将像往常一样继承它

(作为一般规则,在Unix中,操纵调用进程的状态从不的操作对任何其他进程都有任何影响,即使它看起来应该如此;作为一般规则,当我们说这样的事情是在fork上继承的时候,我们的意思是那条状态被复制到孩子身上,而不是在父母和孩子之间共享。一个重要的例外是“打开文件描述“s, 共享。如果你在一个分叉的进程中打开一个常规文件,并且子进程在其继承的文件描述符上调用lseek,那么父进程将看到搜索指针移动。)