确实是有控制终端的会话

确实是有控制终端的会话

当我们说一个进程有一个控制终端时,我们是指该进程本身有一个控制终端,还是该进程所属的会话有一个控制终端?

我曾经认为它是具有控制终端的会话,但后来我读到了以下内容(来自这里)这意味着它是具有控制终端的进程:

进程的属性之一是其控制终端。使用 fork 创建的子进程继承其父进程的控制终端。这样,会话中的所有进程都会从会话领导者那里继承控制终端。控制终端的会话领导者称为该终端的控制进程。

答案1

确实是有控制终端的会话

单一 UNIX 规范描述了这种关系控制终端“与会话关联”。正如它继续指出的,控制终端与会话具有 1:1 的关系。一个会话关联的“至多一个主控终端”,“一个主控终端恰好关联一个会话”。

自由BSD设计与实现本书对此的处理略有不同,但达到了相同的目的。共享同一个会话的进程不可能有不同的控制终端,也不可能单个终端同时是多个会话的控制终端。

在 FreeBSD 内部,这就是数据结构的实际工作方式。进程结构体有一个指针,指向pgrp表示该进程所属进程组的结构体,该结构体又指向表示session该进程组所属会话的结构体,该结构体又指向tty该会话的控制终端的结构体。

在 Linux 内部,事情稍微复杂一些。每个进程task_struct都有一组指向pid其进程组 ID 和会话 ID 的结构的指针;并且有另一个指向每个进程signal_struct结构的指针,该结构又直接指向tty控制终端的结构。

进一步阅读

  • 乔治·V·内维尔-尼尔、马歇尔·柯克·麦库西克和罗伯特·NM·沃森 (2014-09-25)。 “流程管理”。FreeBSD操作系统的设计与实现。艾迪生-韦斯利专业人士。国际标准书号 9780133761832。
  • 唐纳德·卢恩 (1991)。 “终端输入/输出”。 POSIX 程序员指南。奥莱利媒体公司 ISBN 9780937175736。
  • 丹尼尔·P·播威和马可·塞萨蒂 (2005)。 “过程”。 了解 Linux 内核:从 I/O 端口到进程管理。第三版。奥莱利媒体公司 ISBN 9780596554910。
  • “定义”。 The Open Group 基本规格。第 7 期。2016 年。IEEE 1003.1:2008。
  • “通用终端接口”。 The Open Group 基本规格。第 7 期。2016 年。IEEE 1003.1:2008。

答案2

我的知识不够,以下答案可能是错误的

@钥匙::

任何进程都可以通过 .tty 扩展名与其控制 tty 分离(如果有的话)TIOCNOTTY ioctl

https://stackoverflow.com/questions/50649796/how-would-the-existing-processes-in-the-session-learn-about-and-acquire-the-cont

现有的孩子不受影响。

当会话领导者获取控制终端时,会话中的其他现有进程如何也获取控制终端?

=> (@answer::)

  • 在很大的范围内,session_SS(作为许多过程的整体)&controlling_terminal_FF可以是联系或不

  • (现在说,session_SS与 相关controlling_terminal_FF

    对于每个单独的进程(内部session_SS),

    它们仍然不一定与controlling_terminal_FF(即:分离,没有控制终端)

    (他们可以选择controlling_terminal_FF是否关联)

    • 但选项是受约束的仅到一个终端 - controlling_terminal_FF.
  • [[所以,实际上并不存在您通常所说的严格的“拥有/包含”关系,

    它关于“关联/规则/约束”,

    会话可以“拥有/关联”并且进程也可以与终端“拥有/关联”——会话“限制”进程如何关联]]

@细节::

假设您创建了很多进程、进程组、会话。

现在你有一个session_leader_AA过程session_SS

你有一个terminal_FF

当一个session_leader_AAsession_SS 连接/打开() aterminal_FF--terminal_FF成为 的控制终端session_SS(并session_leader_AA成为 的控制进程terminal_FF

  • 子进程继承来自其父进程的控制终端

    • session_SS其中的任何子进程已经存在session_leader_AA连接到之前terminal_FF

      -- 仍未与任何终端连接

    • 其中的任何子进程session_SS都是在session_leader_AA连接到 a之后创建的terminal_FF,但是不是子进程session_leader_AA

      -- 仍未与任何终端连接

  • 任何进程都可以通过 .tty 扩展名与其控制 tty 分离(如果有的话)TIOCNOTTY ioctl

@规则,注意::

  • 1个控制终端只能连接1个会话

    1个会话只能连接1个控制终端

  • 会话中的所有进程都可以有一个(单个)控制终端

    即:进程有一个控制终端(有些进程没有控制终端),并且它们拥有的控制终端必须引用同一个终端。

  • ioctl(fd, TIOCNOTTY)操作可用于删除进程与其控制终端的关联。

    (任何进程都可以调用ioctl(fd, TIOCNOTTY),如果该进程有关联的控制终端)

    (特别是,)如果调用session_leader_AA的控制进程controlling_terminal_FFioctl(fd, TIOCNOTTY)

    发生以下步骤:

    1. 会话中的所有进程都失去与控制终端的关联。

    2. 控制终端失去与会话的关联,

      (因此可以作为控制终端 +- 被另一个会话领导者获取。)

    3. 内核发送 SIGHUP 信号(和 SIGCONT 信号)

      +- 前台进程组的所有成员,

      +- 通知他们控制终端丢失。

    • (这些与控制进程终止时发生的步骤相同)

    Linux 编程接口

  • 还有其他相关的 pbs,尚未确认答案:_

    1. 所以调用非控制终端:_常规终端作为文件/终端连接但非控制,仅用于读取数据

    2. 分离进程是否未从 Controlling_Terminal 接收输入(目的)

      1. 一个session_leader_AAsession_SS 连接/打开() aterminal_FF--terminal_FF成为控制终端session_SS

      2. 子进程继承来自其父进程的控制终端

      似乎是将(会话/)进程与终端关联的唯一两种方法

    3. 似乎 Foreground_Process_Group 中的进程也可以与 Controlling_Terminal 分离

相关内容