答案1
与计算世界中的许多事情一样,原因是历史和向后兼容性。
早在 2.4.* 内核中,在 Linux 中存在udev
(当前的虚拟文件系统解决方案/dev
)之前,有两种相互竞争的解决方案:将设备放在根文件系统上的真实目录中的“传统 Unix 方式”,以及devfs
第一个虚拟文件系统。的文件系统解决方案/dev
。
问题是,作者devfs
为各种设备构建了一个全新的命名方案,人们对此有相当强烈的感觉:一些人希望迁移到新方案并废除旧方案,另一些人则认为没有迁移的必要。一些发行版使用旧的静态设备,其他发行版则选择devfs
.
此时,安装时会创建固定数量的伪 TTY 设备。 (顺便说一句,如果CONFIG_LEGACY_PTYS
在编译内核时设置了该选项,这仍然是可能的。)
然后,引入了Unix98风格的动态分配PTY设备。在静态/dev
目录上实现它们需要一个虚拟文件系统/dev/pts
,这被称为devpts
文件系统。此外,将其作为单独的文件系统可能也可以将其应用在动态之上,devfs
而无需重复代码。
动态分配的 PTY 设备很快成为最受欢迎的选择,因为/dev
数百个静态分配的 PTY 设备杂乱无章,其中大多数很可能在系统的生命周期中永远不会使用,这显然是荒谬的。
然后 Linux 2.6udev
随之而来。它很快就淘汰了静态/dev
和devfs
解决方案。出于向后兼容性的原因,devpts
文件系统仍然存在,但现在相同的功能可以移回主/dev
文件系统,因为它现在完全基于 RAM。
例如,今天,Debian 9 仍然挂载devpts
文件系统以/dev/pts
实现旧版兼容性,但/dev/pts/ptmx
默认分配零权限 - 这表明该devpts
文件系统可能已被弃用,并将在将来的某个时候被删除。
# ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty 5, 2 Nov 22 11:47 /dev/ptmx
c--------- 1 root root 5, 2 Nov 12 14:59 /dev/pts/ptmx
如果某些程序仍然需要/dev/pts/ptmx
,可以通过调整默认权限来允许,但这可以让人们知道哪些程序仍在使用旧的已弃用的设备名称。
答案2
当进程打开 /dev/ptmx 时(使用posix_openpt()),它获取伪终端主设备(PTM)的文件描述符,并在 /dev/pts 目录中创建伪终端从设备(PTS)。
当主设备打开时,从设备被锁定。您可以获取从站的名称并设置其权限等,然后解锁从站。这允许在从属设备可访问之前对其进行控制。
从机模拟真实的文本终端设备,主机提供终端仿真器进程控制从机的方法。
从设备是物理终端的虚拟实现,主设备是在该终端上打字的虚拟实现;计算机对待发送到从机的字符就像人类在真实终端上键入它们一样(受创建主机时的权限设置的限制)。