テレタイプ端末
TeleTYpewriter、略してTTY
キーボードとプリンタ(後にCRTディスプレイ)が一体になった物理デバイス
Claude Code.icon
1960〜70年代、UNIXマシンにはモニターもキーボードも直接ついていなかった
ユーザーはテレタイプ端末という別の箱をケーブルで繋いで操作した。
code:_
┌──────────────────┐ ┌──────────────────┐
│ テレタイプ端末 │ │ UNIXマシン │
│ │ シリアルケーブル │ │
│ キーボード │ ──── 電気信号 ──────────→ │ カーネル │ │ プリンタ/CRT │ ←─── 電気信号 ────────── │ シェル │ │ │ │ │
└──────────────────┘ └──────────────────┘
動作の流れ:
1. ユーザーがテレタイプ端末のキーボードでキーを叩く
2. キーに対応する文字コード(ASCIIコード)が電気信号としてケーブルを流れる 4. カーネル内のTTYドライバが処理する
5. 結果がシリアルポートから電気信号として返される
6. テレタイプ端末のプリンタ/CRTに表示される
code:_
/dev/ttyS0 → 1番目のシリアルポートに繋がった端末
/dev/ttyS1 → 2番目のシリアルポートに繋がった端末
/dev/ttyS2 → 3番目のシリアルポートに繋がった端末
テレタイプ端末をシリアルポート1に繋げば、/dev/ttyS0 に read/write することでその端末と通信できた。
code:c
// カーネル視点:/dev/ttyS0 への write は...
write(fd, "hello\n", 6);
// → シリアルポートから電気信号が出る
// → ケーブルを通ってテレタイプ端末に届く
// → 端末のプリンタ/CRTに "hello" と表示される
1台のUNIXマシンに複数のユーザー
当時のUNIXマシンは高価で、1台を複数人で共有していた。各ユーザーが自分のテレタイプ端末を持ち、それぞれ別のシリアルポートに繋がっていた:
code:_
端末A (ユーザー1) ──→ /dev/ttyS0 ──→ シェルプロセスA
端末B (ユーザー2) ──→ /dev/ttyS1 ──→ シェルプロセスB
端末C (ユーザー3) ──→ /dev/ttyS2 ──→ シェルプロセスC
各シリアルポートに対してログインプロセス(getty)が待ち受けていて、端末が繋がるとログインプロンプトを出す。この仕組みが今でも getty(get tty)という名前で残っている。 テレタイプ端末は1980年代にはほぼ消滅した。
しかしUNIXのAPIとして:
デバイスファイルの命名(/dev/tty*)
カーネルのサブシステム名(TTYサブシステム)
コマンド名(tty, stty)
C言語のAPI(isatty(), tcgetattr())
これらがすべて「TTY」を前提に設計されていた。互換性を壊すわけにいかないので、名前だけがそのまま残った。今「TTY」と言ったとき、テレタイプ端末そのものを指すことはほぼなく、カーネル内の端末処理の仕組み全体を指す。