当我们说一个进程有一个控制终端时,我们是指该进程本身有一个控制终端,还是该进程所属的会话有一个控制终端?
我曾经认为它是具有控制终端的会话,但后来我读到了以下内容(来自这里)这意味着它是具有控制终端的进程:
进程的属性之一是其控制终端。使用 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
。现有的孩子不受影响。
=> (@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_AA
在session_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_FF
ioctl(fd, TIOCNOTTY)
发生以下步骤:
会话中的所有进程都失去与控制终端的关联。
控制终端失去与会话的关联,
(因此可以作为控制终端 +- 被另一个会话领导者获取。)
内核发送 SIGHUP 信号(和 SIGCONT 信号)
+- 前台进程组的所有成员,
+- 通知他们控制终端丢失。
- (这些与控制进程终止时发生的步骤相同)
Linux 编程接口
-
还有其他相关的 pbs,尚未确认答案:_
所以调用非控制终端:_常规终端作为文件/终端连接但非控制,仅用于读取数据
分离进程是否未从 Controlling_Terminal 接收输入(目的)
-
一个
session_leader_AA
在session_SS
连接/打开() aterminal_FF
--terminal_FF
成为控制终端session_SS
子进程继承来自其父进程的控制终端
似乎是将(会话/)进程与终端关联的唯一两种方法
似乎 Foreground_Process_Group 中的进程也可以与 Controlling_Terminal 分离