TTY
TTY 有多重含义,在计算机发展早期是打字机硬件,用户用它输入字符、获取结果。随着计算机发展,打字机被键盘、显示器取代,TTY 作为历史遗留物一直被兼容,演化为了 linux 的一个内核子系统(subsystem)。
计算机早期 TTY
早期计算机,多个用户使用各自的 TTY 和计算机进行交互,因此 TTY 就是终端。[1]
其中的 line discipline 就是用于缓存用户输入,减少系统中断次数的。对于现代操作系统而言不再重要,但仍然保留。
这个功能就是 line discipline 实现的。
line discipline 默认运行于 cooked mode,会缓存、转义字符;可以设置为 raw mode,此时不会做任何处理直接转发。
现代 TTY
现代 linux 中 TTY 不再是一个硬件,而是一个内核子系统,负责用户体验中的一部分功能,比如移动指针、清除屏幕、重置大小等功能。
可以通过 tty
命令查看当前使用哪个 TTY。
~
❯ tty
/dev/pts/9
但是用户空间的模拟终端和用户空间的 shell 交互,又如何和内核空间的 TTY 子系统交互呢?所以 linux 引入了 虚拟终端 (PTY)的概念,用于桥接用户程序与 TTY 子系统。
[^2]/dev/pts/x
中的 pts 其实就是 pseudo-terminal slave 的缩写。想进入一个真正的 TTY 需要到系统控制台按 Ctrl+Alt+Fx
进入不同 TTY。
可以通过 stty
命令控制 TTY 子系统的行为,比如 stty -isig
会让 TTY 不再转义控制字符,而是直接发给后端。事实上 ssh client 连接上 ssh server 之前就会将本机的 isig
关闭,因此用户在 ssh 连接中按 CTRL+C
时,ssh client 不会被中断,^C
字符被未转义地发送给 ssh server,ssh server 发送给自己的 TTY,最后远端服务会话的前台进程收到 TTY 发送到的 SIGINT 信号。[2]
enable interrupt, quit, and suspend special characters