根据我所读到的有关 Linux 中伪终端的内容,伪终端有两种类型:BSD 风格的伪终端(已弃用)和UNIX 98 伪终端。
我创建了两个图像来展示我对这两种类型的伪终端的理解。
下图显示了 BSD 风格的伪终端的工作原理(如果图像错误,请纠正我):
这种类型的伪终端并不难理解,每个终端都连接到一个唯一的主驱动程序。
但在 UNIX 98 伪终端中,事情有点令人困惑。下图显示了我认为这种类型的伪终端的工作原理:
所以基本上所有终端都使用相同的主驱动程序(/dev/ptmx
),但我不确定主驱动程序如何知道如何执行以下操作:
如果数据是从终端进程之一发送的,主驱动程序如何知道数据应传递给哪个 TTY 从驱动程序?
如果数据从 TTY 从属驱动程序之一发送,主驱动程序如何知道数据应传递到哪个终端进程?
主驱动程序是否知道如何按照我在图像中所示的方式执行此操作(即主驱动程序有一个映射表,将每个终端 PID 映射到其相应的 TTY 从驱动程序)?
答案1
你对名字非常着迷。/dev/ptmx
不是“驱动程序”,它只是文件系统中的一个名称,具有特殊含义。
进程通过调用打开一个新的master pty posix_openpt()
,它返回一个文件描述符;open()
调用也可以达到同样的效果/dev/ptmx
。每次一个进程open()
调用/dev/ptmx
一个新的创建伪终端;当没有更多进程打开此文件描述符时,伪终端将被销毁。该文件描述符引用伪终端的主端,并且可以像任何其他文件描述符一样传递给后代进程。
欲了解更多详细信息,请参阅unix.stackexchange.com/questions/117981。 (向@JdeBP 的建议致敬。)
一旦进程拥有指向伪终端主端的文件描述符,它就可以通过调用 找到伪终端从端的名称ptsname()
,并可以将此名称传递给它想要通过伪终端控制的任何进程。