终端
终端
终端
打字机 (Typewriter)
QWERTY 键盘 (1860s)
为降低打字速度设计的防卡纸方案
毕竟机械结构,每一下都需要足够的力量
终端
打字机时代的遗产
Shift
使字锤或字模向上移动一段距离,切换字符集
CR & LF
\r
CR (Carriage Return): 回车,将打印头移回行首
print('Hel\rlo')
\n
LF (Line Feed): 换行,将纸张向上移动一行
UNIX 的
\n
同时包含 CR 和 LF
Tab & Backspace
位置移动 (
Backspace + 减号 = 错了划掉
)
终端
电传打字机 (Teletypewriter)
为了
发电报
设计 (收发两端同时打印)
Telex (teleprinter exchange): 1920s,早于计算机
使用 Baudot Code (5-bit code)
很自然地也能用在计算机上
终端
电传打字机 (cont'd)
Teletype Model 28 (1951);
technical data sheet
终端
VT100: 封神之路
Video Teletypewriter (DEC, 1978)
成为事实上的行业标准
首个完整实现 ANSI Escape Sequence 的终端
80
×
24
80\times 24
80
×
24
字符显示成为标准布局
终端
终端
计算机终端:原理
作为输出设备
接受 UART 信号并显示 (Escape Sequence 就非常自然了)
作为输入设备
把按键的 ASCII 码输出到 UART (所以有很多控制字符)
终端
今天:伪终端 (Pseudo Terminal)
一对 “管道” 提供双向通信通道
主设备 (PTY Master): 连接到终端模拟器
从设备 (PTY Slave): 连接到 shell 或其他程序
例如
/dev/pts/0
伪终端经常被创建
ssh, tmux new-window, ctrl-alt-t, ...
openpty()
: 通过
/dev/ptmx
申请一个新终端
返回两个文件描述符 (master/slave)
(感受到 “操作系统对象” 的恐怖体量了吧)
终端
终端模拟器 (Terminal Emulator)
这下你也会实现了
openpty + fork
子进程:stdin/stdout/stderr 指向 slave
父进程:从 master 读取输出显示到屏幕; 将键盘输入写入 master
甚至可以扩展 Escape Sequence 来显示图片
Kitty:
\033[60C\_
开头,
\033\
结尾
允许控制大小、位置、动画等
kitten icat img.png | cat
应该内嵌 WebView 的
期待这个革命性的产品
终端
终端:更多功能
终端模式
Canonical Mode: 按行处理
回车发送数据 (终端提供行编辑功能)
Non-canonical Mode: 按字符处理
每个字符立即发送给程序
用于实现交互式程序: vim, ssh sshtron.zachlatta.com
终端属性控制
tcgetattr/tcsetattr (terminal control)
可以控制终端的各种行为:回显、信号处理、特殊字符等
(你输密码的时候关闭了终端的回显)