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