我的问题更多的是关于 pty 的概念和设计,而不是它的工作原理。我读了《Linux 编程接口》一书的第 64 章(伪终端),我不明白为什么我们使用一对伪终端(ptmx、pts)而不是一个。当我们查看 /dev/tty[1,6] 时,虚拟终端被模拟并使用一个文件。为什么不对伪终端做同样的事情并使用一个文件而不是两个文件设计一个模拟系统?
答案1
起初我也对此感到困惑,但我相信我现在理解了这个问题的概念(和实践)答案。
这里有两方参与通信。如果您有一个设备,它将像环回一样运行并回显同一设备上写入的所有内容。这将使任何一方都很难知道是谁发送了数据(每个人都会看到刚刚写入设备的数据立即发送回自己)。
从概念上讲,这是通过让每一方从链接到另一设备的一个设备进行写入/读取来解决的。
答案2
到促进将终端仿真移至用户区,同时仍保持 TTY 子系统(会话管理和线路规则)完好无损,伪终端或 pty 被发明了。
一个叫 Linus Akesson 的人有一个TTY 揭秘整个图片的页面。 (我通过 arch linux wiki 找到它添加:mosvy 似乎讨厌它......)。
几天后,我仍然喜欢上面引用的答案。甚至维基百科也有链接。经过一些讨论(见评论,唉)我自由编辑了以下内容。差异可以在“编辑...”按钮中看到...“PTMX”和“TTY Subsystem”是新词。好的官方(?)来源: drivers/tty/Kconfig
和“终端仿真用户区“是 xterm(等)所做的。XTerm 与 X 和窗口管理器一起,必须使 'bash' 感觉像在 Linux VT 上运行。
X 处理用户空间的“一切”的直接后果是:启动许多 xterms/bash 后,每个 xterm 都连接到 pts/0,每个 bash 连接到 pts/1、pts/2,...我也可以开始从内部的子 xterms/bashes 与xterm &
.或者在 xterm 中启动一个新的 shell 层bash
。无论如何,用户很快就会失去对依赖项的跟踪——所以容易的是用 PTY 生成带有 shell 的窗口吗?
来自“TTY 子系统”的 VT (=VC) 使用较多静止的,以 64 作为(第一个?)限制,并且在启动后仅设置 6。从getty/agetty
(“打开 tty 端口,...”)的角度来看,它可能看起来有所不同。
这是我的主要 5 的特殊文件/dev
:
crw-rw-rw- 1 root tty 5, 0 tty
crw------- 1 root root 5, 1 console
crw-rw-rw- 1 root tty 5, 2 ptmx
对吗?该术语显然来自 PTY 的 BSD 风格,当时每个新的 pty 都包含在“p”和“s”文件中。对于 UNIX98_PTY,它是:
/dev/ptmx: MX喜欢复式(不是 MASTER X)用于概念主控端。而对于客户端/dev/pts/1-n
。的/dev/pts/0我现在什么也不想说。一位忙碌的主人和许多忙碌的奴隶。它更像是一对多的关系而不是一对。
这三个major=5的字符设备特殊文件实际上是特殊特殊文件。作为文件,它们没有做太多事情。但每个设备文件背后都有一些代码,这里是drivers/tty/*.c
.键盘处理并不是什么大事。这是 VT 切换和线路纪律,也许两者同时存在。
有一个目录,其中/dev/pts/
包含另一个 ptmx 文件和所有 Major=136 从设备文件。正常/dev/ttyN
有专业=4。
ioctl_console
来自(已删除?)评论的衍生内容:这是另一个 Q 正在讨论的请求之一。“tty 不是虚拟终端”,SK 说ioctl VT_GETSTATE...tty 不是 vt(在最后评论在那里,抱歉)
VT_GETSTATE
Get global vt state info. argp points to a
struct vt_stat {
unsigned short v_active; /* active vt */
unsigned short v_signal; /* signal to send */
unsigned short v_state; /* vt bit mask */
};
For each vt in use, the corresponding bit in the v_state mem‐
ber is set. (Kernels 1.0 through 1.1.92.)
来自config UNIX98_PTY
(drivers/tty 中的 Kconfig)
主站的典型程序是 telnet 服务器和 xterms。
是 bash 进程获取 /dev/pts/1-255,而不是 xterm。 xterm 和 wm 是 x 和 bash 之间的中间人。这是从一开始就与xinit wm x
或共同努力的结果xinit client -- server display
。