Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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行の追加を行いました。主な変更内容は以下の通りです:

  1. ターミナル制御定数の追加: VINTRVQUITVERASEVKILLVEOF等の端末制御文字定数
  2. 入力モードフラグの追加: IGNBRKBRKINTIGNPARPARMRK等の入力処理フラグ
  3. 出力モードフラグの追加: OPOSTOLCUCONLCROCRNL等の出力処理フラグ
  4. ボーレート定数の追加: B0からB4000000までの幅広いボーレート設定値
  5. 制御モードフラグの追加: CSIZECS5CS6CS7CS8等の文字サイズ設定
  6. ローカルモードフラグの追加: ISIGICANONECHOECHOE等のローカル制御フラグ
  7. TCGETS/TCSETS定数の追加: TCGETSTCSETSのioctl定数
  8. Termios構造体の追加: 端末入出力制御のための構造体定義

変更の背景

このコミットは、GoのLinux 386アーキテクチャ向けsyscallパッケージに、端末制御(terminal control)機能を追加するためのものです。2011年当時、Go言語の標準ライブラリにはまだ端末制御に関する低レベルな定数や構造体が十分に整備されていませんでした。

コミットメッセージにある「terminal changes」という表現は、他のプラットフォームで既に実装されていた端末制御機能をLinux 386アーキテクチャにも適用したことを示唆しています。Go言語の開発チームは、各アーキテクチャ・OS組み合わせに対してプラットフォーム固有の定数や構造体を段階的に追加していました。

前提知識の解説

termios(Terminal I/O Settings)

termiosは、UNIX系OSにおいて端末の入出力特性を制御するためのシステムです。端末デバイスの動作を細かく制御するために、以下の4つの主要なフラグ群を持っています:

  1. 入力フラグ(Input Flags - c_iflag): 入力処理の制御
  2. 出力フラグ(Output Flags - c_oflag): 出力処理の制御
  3. 制御フラグ(Control Flags - c_cflag): ハードウェア制御
  4. ローカルフラグ(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の構造体とのアライメントを保証するために追加されています。

システムコールとの連携

追加されたTCGETSTCSETS定数は、以下のようなシステムコールで使用されます:

  • TCGETS: 現在の端末属性を取得
  • TCSETS: 端末属性を設定

関連リンク

参考にした情報源リンク