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

[インデックス 10029] ファイルの概要

コミット

コミット: 7bc4f8de0fc91b209265f797fd20820914f5baaa
作成者: Adam Langley agl@golang.org
日付: 2011年10月18日 12:58:57 (UTC-4)
メッセージ: exp/terminal: split terminal handling from exp/ssh

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/7bc4f8de0fc91b209265f797fd20820914f5baaa

元コミット内容

exp/terminal: split terminal handling from exp/ssh

This change splits terminal handling from exp/ssh, as suggested
several times in the ssh code review.

shell.go and shell_test.go are copies from exp/ssh with minimal
changes, so don't need another full review. A future CL will remove
that code from exp/ssh.

R=bradfitz, r, dave, rsc
CC=golang-dev
https://golang.org/cl/5278049

変更されたファイル:

  • src/pkg/exp/terminal/Makefile (15行追加)
  • src/pkg/exp/terminal/shell.go (359行追加)
  • src/pkg/exp/terminal/shell_test.go (110行追加)
  • src/pkg/exp/terminal/terminal.go (103行追加)
  • src/pkg/syscall/types_linux.c (107行追加)
  • src/pkg/syscall/ztypes_linux_amd64.go (111行追加)

合計: 6ファイル変更、805行追加

変更の背景

このコミットは、Go言語の初期開発段階(2011年)において、SSH機能と端末処理機能の分離を行った重要な変更です。当時、Goはバージョン1.0のリリース前で、実験的パッケージ(exp/)の下で新機能の開発が進められていました。

SSH実装の開発過程で、端末処理(terminal handling)機能がSSH特有の機能と密結合になっていることが問題となっていました。コードレビューの過程で複数回にわたって、この機能を分離すべきという提案がなされており、このコミットでその分離が実現されました。

この分離により、端末処理機能は独立したパッケージとして再利用可能になり、SSH以外の用途でも利用できるようになりました。これは、Go言語の設計哲学である「小さく、再利用可能なコンポーネントの組み合わせ」に沿った変更でした。

前提知識の解説

端末処理(Terminal Handling)とは

端末処理とは、コンピューターの端末(ターミナル)との入出力を制御する機能です。これには以下のような機能が含まれます:

  1. PTY(Pseudo Terminal)管理: 仮想端末の作成と制御
  2. 端末サイズの取得・設定: 行数、列数、ピクセル数の管理
  3. 端末モードの制御: raw mode、cooked mode等の設定
  4. シグナル処理: SIGWINCH(ウィンドウサイズ変更)等の処理

SSH(Secure Shell)との関係

SSH接続では、リモートホストとの間で端末セッションを確立する必要があります。この際、以下の機能が必要になります:

  1. 端末エミュレーション: クライアント側の端末をサーバー側で再現
  2. 端末サイズの同期: クライアントとサーバー間でのウィンドウサイズ同期
  3. 制御文字の処理: Ctrl+C、Ctrl+Z等の制御文字の適切な処理

実験的パッケージ(exp/)について

Go 1.0リリース以前、新機能はexp/パッケージの下で開発されていました。これらのパッケージは:

  1. API安定性の保証なし: 将来的に大きく変更される可能性
  2. 実験的な実装: 新しいアイデアや機能の試作品
  3. フィードバック収集: コミュニティからの意見を収集する場

技術的詳細

システムコール層の実装

このコミットでは、Linux向けのシステムコール定義が追加されています:

  1. types_linux.c: C言語でのシステムコール型定義
  2. ztypes_linux_amd64.go: AMD64アーキテクチャ向けのGo型定義

これらのファイルは、端末制御に必要な低レベルシステムコールをGoから呼び出すために必要です。

端末サイズ構造体

端末のサイズを表現するための構造体が定義されています:

type Winsize struct {
    Row    uint16  // 行数
    Col    uint16  // 列数 
    Xpixel uint16  // 幅(ピクセル)
    Ypixel uint16  // 高さ(ピクセル)
}

PTY(Pseudo Terminal)の実装

仮想端末の作成と制御のための機能が実装されています:

  1. マスター・スレーブ構造: PTYペアの作成と管理
  2. I/O制御: 非ブロッキングI/O、バッファリング制御
  3. シグナル処理: SIGWINCH等のシグナルの適切な処理

コアとなるコードの変更箇所

1. Makefile の追加

新しいパッケージのビルド設定が追加されました。

2. shell.go の移動

SSH パッケージから端末処理機能が分離され、独立したシェル実装が作成されました。

3. shell_test.go の追加

端末処理機能のテストコードが追加されました。

4. terminal.go の実装

端末制御の基本機能が実装されました。

5. システムコール定義の追加

Linux向けの端末制御システムコールが定義されました。

コアとなるコードの解説

端末サイズ取得機能

端末のサイズを取得する機能は、SSH接続時にクライアントとサーバー間でウィンドウサイズを同期するために重要です。これにより、リモートアプリケーションが適切な画面サイズで動作できます。

PTY管理機能

仮想端末の作成と管理機能は、SSH接続時にサーバー側で端末セッションを提供するために必要です。この機能により、リモートからのコマンド実行が可能になります。

シグナル処理

SIGWINCH(ウィンドウサイズ変更)シグナルの処理により、端末のサイズが変更された際に適切に対応できます。これはインタラクティブなSSHセッションには不可欠な機能です。

関連リンク

参考にした情報源リンク