1 tty的原型
teletype writer,早期是这样的一个大型设备,多个teletype writer链接起来可以进行实时通信,左端在纸上打的字右端收到后在纸上打出来。
后来做出了可以把字母转码为打孔纸带(二进制码流)的机器:向计算机输入信息时打字在纸上,拿到打孔纸带给计算机读;计算机输出的纸带拿到teletype writer上解码打字到纸上即可。这与我们当前的人机交互方式类似,teletype writer上自带键盘,纸就相当于现在的显示器。
早期计算机都是在机房的,而这个teletype writer设备在用户这一测,便称之为终端(terminal)
2 早期计算机输入架构
但操作系统不能只是接上输入设备就完事大吉了,作为人机交互的终端还需要考虑如下三个方面:
- 输入校验和流控 UART (Universal Asynchronous Receiver and Transmitter);
- 行编辑(写错字回退等功能);
- 会话管理:一个终端需要能够控制多个进程
所以人机交互便被设计成这个样子
3 桌面输入架构
计算机进入到电子显示器阶段。在早期计算机设备上,电子显示器与计算机的关系就像是现在的机床一样,通过嵌在设备上的电子显示器和按键控制计算机,此时我们便称这个显示器和按钮为——控制台(console),但久而久之,人们惯性的认为显示器就是那个控制台(就像计算机刚刚普及的时候人们都认为显示器就是计算机,给显示器配防尘套,让主机在一旁吃灰)。
UART只能做到打孔纸带级别信息的流控,原先在teletype writer上做的打孔纸带到人类语言的转码也需要集成在计算机中实现,便出现了各类输入输出设备的驱动(driver)负责控制设备与人交互,terminal emulator负责与计算机交互,于是桌面输入架构便成了这个样子。
4 远程输入架构
再发展到后来出现了在远程控制计算机的需求,人需要通过软件远程连接到计算机上与操作系统进行交互,与驱动交互的terminal emulator显然不能满足需求,此时便出现了pty(pseudo tty)负责与负责远程连接的进程(如ssh)进行交互。
现在的linux是多用户操作系统,会为每个远程连接分配一个pty,放在/dev/pts/
目录,也就形成了我们常见的pts(pseudo ttys)
远程用户通过用户态进程ssh读写pts字符设备(文件类型是[c]
)与操作系统通信。
上图ssh下的所有进程的stdin
、stdout
、stderr
都是当前pts设备/dev/pts/0
5 相关命令
tty
:打印当前的ttywho
:查看当前有哪些用户已登录到本系统