[インデックス 10054] ファイルの概要
コミット
- コミットハッシュ: cf0952d352d3f56b9c5a7b4637805051e3814057
- 作成者: Brad Fitzpatrick bradfitz@golang.org
- 日付: 2011年10月19日 08:45:38 (UTC-7)
- コミットメッセージ: syscall: update ztypes_linux_386 for terminal changes
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/cf0952d352d3f56b9c5a7b4637805051e3814057
元コミット内容
このコミットはsrc/pkg/syscall/ztypes_linux_386.go
ファイルに対して111行の追加を行いました。主な変更内容は以下の通りです:
- ターミナル制御定数の追加:
VINTR
、VQUIT
、VERASE
、VKILL
、VEOF
等の端末制御文字定数 - 入力モードフラグの追加:
IGNBRK
、BRKINT
、IGNPAR
、PARMRK
等の入力処理フラグ - 出力モードフラグの追加:
OPOST
、OLCUC
、ONLCR
、OCRNL
等の出力処理フラグ - ボーレート定数の追加:
B0
からB4000000
までの幅広いボーレート設定値 - 制御モードフラグの追加:
CSIZE
、CS5
、CS6
、CS7
、CS8
等の文字サイズ設定 - ローカルモードフラグの追加:
ISIG
、ICANON
、ECHO
、ECHOE
等のローカル制御フラグ - TCGETS/TCSETS定数の追加:
TCGETS
とTCSETS
のioctl定数 - Termios構造体の追加: 端末入出力制御のための構造体定義
変更の背景
このコミットは、GoのLinux 386アーキテクチャ向けsyscallパッケージに、端末制御(terminal control)機能を追加するためのものです。2011年当時、Go言語の標準ライブラリにはまだ端末制御に関する低レベルな定数や構造体が十分に整備されていませんでした。
コミットメッセージにある「terminal changes」という表現は、他のプラットフォームで既に実装されていた端末制御機能をLinux 386アーキテクチャにも適用したことを示唆しています。Go言語の開発チームは、各アーキテクチャ・OS組み合わせに対してプラットフォーム固有の定数や構造体を段階的に追加していました。
前提知識の解説
termios(Terminal I/O Settings)
termios
は、UNIX系OSにおいて端末の入出力特性を制御するためのシステムです。端末デバイスの動作を細かく制御するために、以下の4つの主要なフラグ群を持っています:
- 入力フラグ(Input Flags - c_iflag): 入力処理の制御
- 出力フラグ(Output Flags - c_oflag): 出力処理の制御
- 制御フラグ(Control Flags - c_cflag): ハードウェア制御
- ローカルフラグ(Local Flags - c_lflag): 端末のローカル制御
端末制御文字(Control Characters)
端末制御文字は、特定の機能を実行するために使用される文字です:
- VINTR: 割り込み文字(通常はCtrl+C)- SIGINTシグナルを送信
- VQUIT: 終了文字(通常はCtrl+\)- SIGQUITシグナルを送信
- VEOF: ファイル終端文字(通常はCtrl+D)- 入力の終了を示す
- VERASE: 消去文字(通常はBackspace)- 直前の文字を削除
- VKILL: 行削除文字(通常はCtrl+U)- 行全体を削除
ボーレート(Baud Rate)
ボーレートは、シリアル通信における1秒間当たりのシンボル数を表します。このコミットでは、50bpsから4Mbpsまでの幅広いボーレート設定が追加されています。
syscallパッケージの役割
Goのsyscall
パッケージは、オペレーティングシステムの低レベルプリミティブへのインターフェースを提供します。各OS・アーキテクチャ固有の定数や構造体を定義し、システムコールを安全に呼び出すための仕組みを提供しています。
技術的詳細
1. 端末制御文字定数の実装
VINTR = 0
VQUIT = 0x1
VERASE = 0x2
VKILL = 0x3
VEOF = 0x4
これらの定数は、termios.c_cc
配列のインデックスとして使用されます。各定数は、対応する制御文字を格納する配列要素の位置を示しています。
2. 入力モードフラグの実装
IGNBRK = 0x1 // ブレーク条件を無視
BRKINT = 0x2 // ブレーク時に割り込み
IGNPAR = 0x4 // パリティエラーを無視
PARMRK = 0x8 // パリティエラーをマーク
これらのフラグは、シリアル通信やターミナル入力の処理方法を制御します。
3. ボーレート定数の体系的実装
コミットでは、以下のようなボーレート定数が追加されました:
- 標準ボーレート: B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400
- 高速ボーレート: B57600, B115200, B230400, B460800, B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000, B4000000
4. Termios構造体の定義
type Termios struct {
Iflag uint32 // 入力フラグ
Oflag uint32 // 出力フラグ
Cflag uint32 // 制御フラグ
Lflag uint32 // ローカルフラグ
Line uint8 // 行制御
Cc [32]uint8 // 制御文字配列
Pad_godefs_0 [3]byte // パディング
Ispeed uint32 // 入力スピード
Ospeed uint32 // 出力スピード
}
この構造体は、LinuxのtermiosシステムコールでCのstruct termios
と互換性を持つよう設計されています。
コアとなるコードの変更箇所
1. 制御文字定数の追加(22-38行目)
VINTR = 0
VQUIT = 0x1
VERASE = 0x2
VKILL = 0x3
VEOF = 0x4
VTIME = 0x5
VMIN = 0x6
VSWTC = 0x7
VSTART = 0x8
VSTOP = 0x9
VSUSP = 0xa
VEOL = 0xb
VREPRINT = 0xc
VDISCARD = 0xd
VWERASE = 0xe
VLNEXT = 0xf
VEOL2 = 0x10
2. 入力モードフラグの追加(39-54行目)
IGNBRK = 0x1
BRKINT = 0x2
IGNPAR = 0x4
PARMRK = 0x8
INPCK = 0x10
ISTRIP = 0x20
INLCR = 0x40
IGNCR = 0x80
ICRNL = 0x100
IUCLC = 0x200
IXON = 0x400
IXANY = 0x800
IXOFF = 0x1000
IMAXBEL = 0x2000
IUTF8 = 0x4000
3. Termios構造体の追加(129-139行目)
type Termios struct {
Iflag uint32
Oflag uint32
Cflag uint32
Lflag uint32
Line uint8
Cc [32]uint8
Pad_godefs_0 [3]byte
Ispeed uint32
Ospeed uint32
}
コアとなるコードの解説
制御文字の配列インデックス設計
制御文字定数は、termios.c_cc
配列のインデックスとして機能します。例えば:
termios.c_cc[VINTR]
には割り込み文字(通常はCtrl+C)が格納されるtermios.c_cc[VEOF]
にはファイル終端文字(通常はCtrl+D)が格納される
この設計により、アプリケーションは定数名を使用して制御文字を設定・取得できます。
フラグのビットマスク設計
各フラグは2の累乗値を持ち、ビットマスクとして組み合わせて使用されます:
// 例:複数のフラグを組み合わせる
flags := IGNBRK | BRKINT | IGNPAR
構造体のメモリレイアウト
Termios
構造体は、Linux kernelのstruct termios
と完全に互換性があります。Pad_godefs_0
フィールドは、Cの構造体とのアライメントを保証するために追加されています。
システムコールとの連携
追加されたTCGETS
とTCSETS
定数は、以下のようなシステムコールで使用されます:
TCGETS
: 現在の端末属性を取得TCSETS
: 端末属性を設定
関連リンク
- Go syscall パッケージ公式ドキュメント
- Linux termios(3) マニュアルページ
- POSIX termios.h 仕様
- Go 言語の github.com/pkg/term/termios パッケージ