BSD 风格的伪终端与 UNIX 98 伪终端

BSD 风格的伪终端与 UNIX 98 伪终端

根据我所读到的有关 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(),并可以将此名称传递给它想要通过伪终端控制的任何进程。

相关内容