终端设备

优质
小牛编辑
118浏览
2023-12-01

终端(或TTY)设备是一种特殊的字符设备。终端设备是可以在会话中用作控制终端的任何设备,包括:虚拟控制台、串行接口、伪终端(PTY)。

所有终端设备共享一个通用的功能集合(线路规则),这包含常规的终端线路规程以及SLIP和PPP模式。所有的终端设备的命名都很相似。这部分内容 将解释命名规则和各种类型的TTY(终端)的使用。需要注意的是这些命名习惯包含了几个历史遗留包袱。其中的一些是Linux所特有的,另一些则是继承自 其他系统,还有一些反映了Linux在成长过程中抛弃了原来借用自其它系统的一些习惯。井号(#)在设备名里表示一个无前导零的十进制数。

虚拟控制台和控制台设备

虚拟控制台是在系统视频监视器上显示的全屏终端。虚拟控制台被命名为 /dev/tty# (编号从 /dev/tty1 开始)。/dev/tty0 是当前虚拟控制台。/dev/tty0 用于在不能使用帧缓冲设备(/dev/fb*)的机器上存取系统显卡,但 /dev/console 并不用于此目的。控制台设备(/dev/console)由内核直接管理,用于接收和显示系统消息,以及单用户模式登陆。

串行接口

这里所说的"串行接口"是指 RS-232 串口和任何模拟这种接口的设备,无论是硬件(如调制解调器)还是软件(如ISDN驱动)。Linux中的每一个串口都有两个设备名:主设备或呼入 (callin)设备、辅设备或呼出(callout)设备。两者之间使用字母的大小写进行区分。比如,对于任意字母"X",设备名分别为 /dev/ttyX# 与 /dev/cux# 。由于历史原因,/dev/ttyS# 和 /dev/ttyC# 分别等价于 /dev/cua# 和 /dev/cub# 。名称 /dev/ttyQ# 和 /dev/cuq# 被保留为仅供本地使用。

串口的仲裁是通过锁文件(/var/lock/LCK..ttyX#)来提供的。锁文件的内容应该是以ASCII码表示的锁定进程的PID。常见的 做法是安装一个诸如 /dev/modem 这样的链接来指向串口。为了确保能够正确的预先锁定这些链接,软件应该追踪符号链接并锁定所有可能的名字。此外,还建议为相应的辅设备安装对应的锁文件。 为了避免死锁,建议按以下顺序获取锁,并按相反的顺序释放锁:

  1. 符号链接名,如果有(/var/lock/LCK..modem)
  2. "tty"名(/var/lock/LCK..ttyS2)
  3. 辅设备名(/var/lock/LCK..cua2)

在符号链接出现嵌套的情况下,锁文件应按照符号链接的解析顺序来安装。

在任何情况下,应用程序都应该等待另一个程序释放锁之后,再持有这个锁。此外,试图为辅设备创建锁文件的应用程序应考虑被用于非串口的TTY端口的可能性(此时不存在辅设备)。

伪终端(PTY)

伪终端既可以用于创建登陆会话,也可以为其他需要通过TTY线路规则(包括SLIP或者PPP功能)来生成数据的进程提供帮助。每一个 PTY 都有一个master端和一个slave端。按照 System V/Unix98 的 PTY 命名方案,所有master端共享同一个 /dev/ptmx 设备节点(打开它内核将自动给出一个未分配的PTY),所有slave端都位于 /dev/pts/ 目录下,名为 /dev/pts/# (内核会根据需要自动生成和删除它们)。

一旦master端被打开,相应的slave设备就可以按照与 TTY 设备完全相同的方式使用。master设备与slave设备之间通过内核进行连接,等价于拥有 TTY 功能的双向管道(pipe)。