tty 子系统

AIX® 是多用户操作系统,允许用户从本地或远程连接的设备进行访问。 支持此功能的通信层是 tty 子系统。

终端设备与读写它们的程序之间的通信由 tty 接口控制。 tty 设备的例子有:

  • 调制解调器
  • ASCII 终端
  • 系统控制台
  • 串行打印机
  • X-Windows 下的 Xterm 或 aixterm

此概述提供了有关以下主题的信息:

TTY 子系统目标

tty 子系统负责:

  • 控制异步线路上的物理数据流(包括传输速度、字符大小和线路可用性)
  • 通过识别特殊字符并配合本地语言来解释数据
  • 使用控制终端的概念来控制作业和终端访问

“控制终端”管理一组进程的输入输出操作。 tty 特殊文件支持控制终端接口。 实际上,用户程序很少打开终端文件,例如 dev/tty5。 这些文件是通过 gettyrlogind 命令打开的并且成为用户的标准输入和输出设备。

tty 子系统模块

为了执行其任务,tty 子系统由模块或规程组成。 模块是一组管理计算机与异步设备之间通信的接口的处理规则。 可以为每个 tty 动态添加和除去模块。

tty 子系统支持三个主要模块类型。

tty 驱动程序

tty 驱动程序或硬件规程直接控制硬件(tty 设备)或伪硬件(pty 设备)。 它们通过向适配器之上的模块提供服务来执行对适配器的实际输入和输出。 当端口打开时,服务是流量控制和特殊语义。

提供了以下 tty 驱动程序:

驱动程序 描述
cxma 128 端口异步 PCI 控制器。
cxpa 8 端口异步 PCI 控制器。
lft 低功能终端。 tty 名称为 /dev/lftY,其中 Y > = 0。
sa 2 个端口的异步 EIA-232 PCI 适配器。
SF 系统板上的通用异步收发器 (UART)。

TTY 驱动程序 部分提供了更多信息。

线路规程

线路规程提供编辑、作业控制和对特殊字符的解释。 它们执行在入站和出站数据流上发生的各种转换。 线路规程还执行大多数的错误处理和对 tty 驱动程序的状态监视。

提供了以下线路规程:

子例程 描述
ldterm 终端设备
sptr 串行打印机 (splp 命令)
slip 串行线路 Internet Protocol (slattach 命令)
转换器模块

转换器模块或映射规程 、转换或映射、输入并输出字符。

提供了以下转换器模块:

转换器 描述
NLS 终端映射的本地语言支持; 此转换器根据为端口定义的输入和输出映射来转换数据流上的传入和传出字符 (请参阅 setmaps 命令)
lc_sjisuc_sjis 较高层转换器和较低层转换器, 用于在转换的日本工业标准 (SJIS) 和高级日语 EUC 代码 (AJEC) 之间转换多字节字符,这种转换由 ldterm 线路规程来处理。

转换器模块 提供有关转换器的更多信息。

TTY 子系统结构

tty 子系统基于 STREAMS。 这种基于 STREAMS 的结构提供模块化和灵活性并支持以下功能:

  • 轻松的定制;用户能够通过添加和除去所选择的模块来定制自己的终端子系统环境。
  • 可重用的模块;例如同一线路规程模块能够用在很多配置不同的 tty 设备上。
  • 轻松地向终端子系统添加新功能。
  • 在不同种类的设备上提供同类 tty 接口。

tty 流的结构由以下模块组成:

  • 流头部,处理用户的请求。 流头部对所有 tty 设备都相同,不论使用的是何种线路规程或 tty 驱动程序。
  • 可选的较高层转换器(以 uc_sjis 为例), 推送至线路规程之上的、转换上行和下行数据的转换器模块。
  • 线路规程
  • 可选的较低层转换器(以 lc_sjis 为例), 推送至线路规程之下的、转换上行和下行数据的转换器模块。
  • 可选的字符映射模块 (nls), 推送至 tty 驱动程序之上的、支持输入和输出终端映射的转换器模块。
  • 流末端:tty 驱动程序。

除非有要求,否则 tty 流中不存在国际化模块。

对于串行打印机,流中通常不存在国际化模块;因此结构比较简单。

共同事务

/usr/include/sys/ioctl.h/usr/include/termios.h 文件描述由 tty 子系统提供的公共服务的接口。 由所有模块使用的 ioctl.h 文件,包括 winsize 结构以及数个 ioctl 命令。 termios.h 文件包含符合 POSIX 的子例程和数据类型。

此处将根据所提供的服务的特定功能对它们进行分组和讨论。

硬件控制服务

提供以下子例程用于硬件控制:

子例程 描述
cfgetispeed 获取输入波特率
cfgetospeed 获取输出波特率
cfsetispeed 设置输入波特率
cfsetospeed 设置输出波特率
tcsendbreak 在异步串行数据行上发送一个中断

流量控制服务

提供以下子例程用于流量控制:

子例程 描述
tc漏极 等待输出完成
tcflow 执行流量控制功能
tcflush 从指定的队列丢弃数据

终端信息和控制

提供以下子例程用于终端信息和控制:

子例程 描述
isatty 确定设备是否为终端
setcsmap 读取代码集映射文件并且将它指定给标准输入设备
tcgetattr 获取终端状态
tcsetattr 设置终端状态
ttylockttywaitttyunlock ttylocked 控制 tty 锁定功能
ttyname 获取终端名称

窗口和终端大小服务

内核存储 winsize 结构以便为当前终端或窗口的大小提供稳定的接口。 winsize 结构包含以下字段:

字段 描述
ws_row 表示窗口或终端上的行数(以字符计)
ws_col 表示窗口或终端上的列数(以字符计)
ws_xpixel 表示窗口或终端的水平尺寸(以像素计)。
ws_ypixel 表示窗口或终端的垂直尺寸(以像素计)。

按惯例,winsize 结构所有字段中的值 0 均表示结构尚未设置。

子例程 描述
termdef 查询终端特征。
TIOCGWINSZ 获取窗口大小。 此 ioctl 操作的参数是 winsize 结构的指针, 其中存放着当前终端或窗口的大小。
TIOCSWINSZ 设置窗口大小。 此 ioctl 操作的参数是 winsize 结构的指针, 它用来设置当前终端或窗口的大小信息。 如果新增信息和以前的信息不同,那么将 SIGWINCH 信号发送到终端进程组。

进程组管理服务

提供以下子例程用于进程组管理:

子例程 描述
tcgetpgrp 获取前台进程组标识
tcsetpgrp 设置前台进程组标识

缓冲区大小操作

以下 ioctl 操作用于设置终端输入和输出缓冲区的大小。 这些操作的参数是指向指定缓冲区大小的整数的指针。

操作 描述
TXSETIHOG 对在进程读取之前能够接收并存储于内部 tty 缓冲区的输入字符的数目设置独占限制。 缺省独占限制是 8192 个字符。 一旦达到比独占限制多一个字符,那么将一条错误记录到错误日志并清空输入缓冲区。 该独占数字不应太大,因为缓冲区分配自受系统牵制的内存。
TXSETOHOG 对缓冲到回传输入的输出字符的数目设置独占限制。 缺省独占限制是 8192 个字符。 一旦达到独占输出限制,输入字符就不再回传。 该独占数字不应太大,因为缓冲区分配自受系统牵制的内存。

同步

tty 子系统利用 STREAMS 提供的同步。 tty 流模块使用队列对级别同步进行配置。 这种同步允许对两个不同的流进行并行处理。