是具有控制终端的进程,还是具有控制终端的会话?

Jos*_*eph 6 linux terminal

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

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

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

Jde*_*eBP 11

确实是具有控制终端的会话

单一UNIX规范描述了在换算的关系控制终端的存在“与会话相关联”。正如它继续指定的那样,控制终端与会话具有 1:1 的关系。“最多有一个控制终端”与一个会话相关联,而“一个控制终端与一个会话相关联”。

FreeBSD设计和实现这本书的方法略有不同,但都达到了相同的地方。共享同一个会话的进程不可能有不同的控制终端,单个终端也不可能成为多个会话的控制终端。

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

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

进一步阅读

  • George V. Neville-Neil、Marshall Kirk McKusick 和 Robert NM Watson (2014-09-25)。“流程管理”。FreeBSD 操作系统的设计与实现。艾迪生韦斯利专业。国际标准书号 9780133761832。
  • 唐纳德·勒温 (1991)。“终端输入/输出”。 POSIX 程序员指南。O'Reilly Media, Inc. ISBN 9780937175736。
  • Daniel P. Bovet 和 Marco Cesati (2005)。“过程”。 了解 Linux 内核:从 I/O 端口到进程管理。第 3 版。O'Reilly Media, Inc. ISBN 9780596554910。
  • “定义”。 开放组基本规范。2016 年第 7 期。IEEE 1003.1:2008。
  • “通用终端接口”。 开放组基本规范。2016 年第 7 期。IEEE 1003.1:2008。