一个会话中有多个控制终端吗?

一个会话中有多个控制终端吗?

阅读 2018 年第 7 期 Open Group 基础规范时,其中写道11.1.3节 控制终端

终端可以作为进程的控制终端属于进程。具有控制终端的会话的每个进程都具有相同的控制终端。一个终端最多可以是一个会话的控制终端。会话的控制终端由会话领导者以实现定义的方式分配。

我对第二句“具有控制终端的会话的每个进程都具有相同的控制终端”的含义感到好奇。这似乎意味着一个会话中不能有多个控制终端。然而,在 Ubuntu 桌面上,我可以在一个会话中同时打开两个或多个 gnome 终端窗口(例如,以 UID=1000 的用户身份登录时),其中显然每个终端都是其自身进程组的控制终端(因此此会话中有多个控制终端)。这是否与上述陈述相冲突,还是我哪里搞错了?

答案1

我可以在一个会话中同时打开两个或多个 gnome 终端窗口(例如以 UID=1000 的用户身份登录时)

不,因为这不是规范中所说的“会话”的意思。

在信号和控制终端的上下文中,通过调用来创建会话设置 id(3),并且仅用作进程组的“超级组”,用于信号传递目的。

它与 systemd-logind 跟踪的会话对象无关,也与 X11 SM/ICE 会话无关,也与桌面环境会话 (gnome-session 等) 无关,也与与“以相同 UID 运行的进程”相关联的一般英语术语“登录会话”无关。

换句话说,相同的环境(登录会话,缺乏更好的术语)可以拥有任意数量的 POSIX tty 会话 - 通常终端仿真器将为每个窗口或选项卡调用 setsid(),确保每个 pty 对应一个 POSIX 会话。

答案2

会议根据 Open Group Base 规范 2018 年第 7 期:

为作业控制目的而建立的进程组集合。每个进程组都是一个会话的成员。进程被视为其进程组所属会话的成员。新创建的进程加入其创建者的会话。进程可以更改其会话成员身份;请参阅setsid()。同一会话中可以有多个进程组。

这不是 Ubuntu 桌面环境中所谓的“会话”。因此产生了误解。

相关内容