[インデックス 17594] ファイルの概要
このコミットは、Go言語のsyscall
パッケージに、Linuxシステムコールで使用されるtermios
関連の定数であるTCIFLUSH
、TCIOFLUSH
、TCOFLUSH
を追加するものです。これにより、Goプログラムからこれらの定数を利用して、ターミナルI/Oバッファのフラッシュ操作をより細かく制御できるようになります。特に、zerrors_linux_386.go
、zerrors_linux_amd64.go
、zerrors_linux_arm.go
といったアーキテクチャ固有のファイルにこれらの定数が追加され、関連するテストファイルも更新されています。
コミット
- コミットハッシュ:
bd9cd6e30e629f8751c978a75befc087b4cb5617
- Author: Dave Cheney dave@cheney.net
- Date: Fri Sep 13 15:01:22 2013 +1000
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/bd9cd6e30e629f8751c978a75befc087b4cb5617
元コミット内容
syscall: add TCIOFLUSH family of constants
Fixes #6355.
zerrors_linux_{386,amd64,arm}.go were regenerated using mkerrors.sh but I opted to add the three TC.*FLUSH lines by hand to keep the diff smaller and avoid problems with the API checker.
I'll check freebsd and darwin, could I ask for help with net/open bsd.
R=mikioh.mikioh, jsing, minux.ma, bradfitz
CC=golang-dev
https://golang.org/cl/13660043
変更の背景
この変更は、Goのsyscall
パッケージがLinuxのtermios
関連の定数を欠いていたため、それらを追加することを目的としています。特に、Issue #6355を解決するために行われました。termios
は、Unix系システムにおけるターミナルI/Oの設定を制御するためのインターフェースであり、TCIFLUSH
、TCIOFLUSH
、TCOFLUSH
といった定数は、ターミナルの入力/出力バッファをフラッシュするために使用されます。これらの定数がGoのsyscall
パッケージに存在しないと、Goプログラムからこれらの低レベルなターミナル制御操作を直接行うことができませんでした。このコミットにより、Goプログラムがより高度なターミナル操作を行えるようになります。
コミットメッセージには、zerrors_linux_{386,amd64,arm}.go
ファイルがmkerrors.sh
スクリプトによって再生成されたものの、差分を小さく保ち、APIチェッカーの問題を避けるために、TC.*FLUSH
の3行を手動で追加したことが明記されています。これは、自動生成ツールが常に最適な差分を生成するわけではないこと、およびAPIの互換性を維持するための配慮を示しています。
前提知識の解説
Go言語のsyscall
パッケージ
Go言語のsyscall
パッケージは、オペレーティングシステムが提供する低レベルなプリミティブ(システムコール)へのアクセスを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理、メモリ管理など、OSカーネルが提供する機能に直接アクセスできます。Goの標準ライブラリの多くの部分は、このsyscall
パッケージの上に構築されています。しかし、特定のOS固有の機能や、より低レベルな制御が必要な場合、開発者はsyscall
パッケージを直接利用することがあります。
termios
構造体とターミナルI/O制御
termios
は、POSIXシステム(Unix、Linux、macOSなど)において、シリアルポートやターミナルデバイスのI/O設定を制御するための標準的なインターフェースです。このインターフェースは、ターミナルの動作(例えば、エコーの有無、入力の正規化、ボーレート、フロー制御など)を細かく設定するために使用されます。C言語では、<termios.h>
ヘッダーファイルで定義されており、tcgetattr()
, tcsetattr()
, tcdrain()
, tcflow()
, tcflush()
などの関数が提供されます。
tcflush()
関数とフラッシュ定数
tcflush()
関数は、ターミナルの入力または出力バッファを破棄(フラッシュ)するために使用されます。これは、例えば、ユーザーが入力したもののまだ読み取られていないデータや、プログラムが出力しようとしているもののまだ送信されていないデータをクリアしたい場合に役立ちます。tcflush()
関数は、どのバッファをフラッシュするかを指定するために、以下の定数を引数として取ります。
TCIFLUSH
: 入力バッファ(受信したもののまだ読み取られていないデータ)をフラッシュします。TCOFLUSH
: 出力バッファ(送信待ちのデータ)をフラッシュします。TCIOFLUSH
: 入力バッファと出力バッファの両方をフラッシュします。
これらの定数は、通常、C言語のヘッダーファイルでマクロとして定義されており、Goのsyscall
パッケージでは、これらのC言語の定数に対応するGoの定数を提供する必要があります。
mkerrors.sh
スクリプトとzerrors_linux_*.go
ファイル
Goのsyscall
パッケージには、各オペレーティングシステムおよびアーキテクチャ固有のシステムコール定数やエラーコードを定義するファイル群があります。これらのファイル(例: zerrors_linux_386.go
, zerrors_linux_amd64.go
, zerrors_linux_arm.go
)は、通常、mkerrors.sh
のようなスクリプトによって自動生成されます。このスクリプトは、C言語のヘッダーファイルを解析し、対応するGoの定数定義を生成する役割を担っています。これにより、Goのsyscall
パッケージは、基盤となるOSのシステムコールインターフェースと同期を保つことができます。
技術的詳細
このコミットの主要な目的は、Linux環境におけるtermios
関連のフラッシュ定数(TCIFLUSH
, TCIOFLUSH
, TCOFLUSH
)をGoのsyscall
パッケージに導入することです。これらの定数は、Goプログラムがターミナルデバイスの入力/出力バッファを制御するために不可欠です。
変更は主に以下の3つの側面で行われています。
-
定数の追加:
src/pkg/syscall/zerrors_linux_386.go
、src/pkg/syscall/zerrors_linux_amd64.go
、src/pkg/syscall/zerrors_linux_arm.go
の各ファイルに、TCIFLUSH
、TCIOFLUSH
、TCOFLUSH
の3つの定数が追加されました。これらの定数には、対応するC言語の定数と同じ値(0x0
,0x2
,0x1
)が割り当てられています。これらのファイルは、Goのビルドプロセスにおいて、各アーキテクチャで利用可能なシステムコール定数をGoのコードから参照できるようにするために重要です。 -
mkerrors.sh
の更新:src/pkg/syscall/mkerrors.sh
スクリプトに、#include <termios.h>
が追加されました。これは、このスクリプトがシステムコール定数を自動生成する際に、termios.h
ヘッダーファイルから関連する定数定義を読み取れるようにするためです。これにより、将来的にtermios
関連の新しい定数が必要になった場合でも、自動生成プロセスで対応できるようになります。ただし、今回のコミットでは、差分を小さく保ち、APIチェッカーの問題を避けるために、TC.*FLUSH
定数は手動でzerrors_linux_*.go
ファイルに追加されたとコミットメッセージに記載されています。これは、自動生成プロセスが常に完璧ではないこと、または特定の状況下で手動介入が必要になる場合があることを示しています。 -
テストの追加:
src/pkg/syscall/consistency_unix_test.go
ファイルに、新しく追加された定数TCIFLUSH
、TCIOFLUSH
、TCOFLUSH
がGoのsyscall
パッケージで利用可能であることを確認するためのテストコードが追加されました。このテストは、_ int = syscall.TCIFLUSH
のような形式で、定数がコンパイル時に正しく解決されることを検証します。これは、Goのsyscall
パッケージの定数が、対応するC言語の定数と一致していることを保証するための重要なステップです。
このコミットはLinuxに特化していますが、コミットメッセージにはFreeBSDやDarwin(macOS)についても確認し、NetBSDやOpenBSDについても協力を求める意向が示されています。これは、Goのsyscall
パッケージがクロスプラットフォームで一貫したシステムコールインターフェースを提供しようとする努力の一環です。
コアとなるコードの変更箇所
src/pkg/syscall/consistency_unix_test.go
--- a/src/pkg/syscall/consistency_unix_test.go
+++ b/src/pkg/syscall/consistency_unix_test.go
@@ -23,3 +23,12 @@ func _() {
_ int = syscall.PRIO_PGRP
)
}
+
+// termios functions and constants
+func _() {
+ const (
+ _ int = syscall.TCIFLUSH
+ _ int = syscall.TCIOFLUSH
+ _ int = syscall.TCOFLUSH
+ )
+}
src/pkg/syscall/mkerrors.sh
--- a/src/pkg/syscall/mkerrors.sh
+++ b/src/pkg/syscall/mkerrors.sh
@@ -107,6 +107,7 @@ includes_Linux='\
#include <net/if_arp.h>\
#include <net/route.h>\
#include <netpacket/packet.h>\
+#include <termios.h>\
#ifndef MSG_FASTOPEN
#define MSG_FASTOPEN 0x20000000
src/pkg/syscall/zerrors_linux_386.go
--- a/src/pkg/syscall/zerrors_linux_386.go
+++ b/src/pkg/syscall/zerrors_linux_386.go
@@ -1084,6 +1084,9 @@ const (
S_IXGRP = 0x8
S_IXOTH = 0x1
S_IXUSR = 0x40
+ TCIFLUSH = 0x0
+ TCIOFLUSH = 0x2
+ TCOFLUSH = 0x1
TCP_CONGESTION = 0xd
TCP_CORK = 0x3
TCP_DEFER_ACCEPT = 0x9
src/pkg/syscall/zerrors_linux_amd64.go
--- a/src/pkg/syscall/zerrors_linux_amd64.go
+++ b/src/pkg/syscall/zerrors_linux_amd64.go
@@ -1085,6 +1085,9 @@ const (
S_IXGRP = 0x8
S_IXOTH = 0x1
S_IXUSR = 0x40
+ TCIFLUSH = 0x0
+ TCIOFLUSH = 0x2
+ TCOFLUSH = 0x1
TCP_CONGESTION = 0xd
TCP_CORK = 0x3
TCP_DEFER_ACCEPT = 0x9
src/pkg/syscall/zerrors_linux_arm.go
--- a/src/pkg/syscall/zerrors_linux_arm.go
+++ b/src/pkg/syscall/zerrors_linux_arm.go
@@ -1095,6 +1095,9 @@ const (
S_IXGRP = 0x8
S_IXOTH = 0x1
S_IXUSR = 0x40
+ TCIFLUSH = 0x0
+ TCIOFLUSH = 0x2
+ TCOFLUSH = 0x1
TCP_CONGESTION = 0xd
TCP_CORK = 0x3
TCP_DEFER_ACCEPT = 0x9
コアとなるコードの解説
src/pkg/syscall/consistency_unix_test.go
の変更
このファイルは、Goのsyscall
パッケージがUnix系システムで提供する定数や関数が、期待通りに存在し、正しい型を持っているかを検証するためのテストコードを含んでいます。追加されたコードブロックは、termios
関連の定数TCIFLUSH
、TCIOFLUSH
、TCOFLUSH
がsyscall
パッケージ内でint
型として定義されていることをコンパイル時に確認します。これは、これらの定数がGoプログラムから正しく参照できることを保証するための基本的な健全性チェックです。
src/pkg/syscall/mkerrors.sh
の変更
mkerrors.sh
スクリプトは、Goのsyscall
パッケージで使用されるOS固有の定数ファイルを自動生成するためのものです。この変更では、Linux向けのインクルードリストに#include <termios.h>
が追加されました。これにより、スクリプトがC言語のtermios.h
ヘッダーファイルを解析し、そこに含まれる定数(例えば、TCIFLUSH
など)をGoのコードに変換できるようになります。コミットメッセージにあるように、今回のTC.*FLUSH
定数は手動で追加されましたが、この変更は将来的な自動生成の基盤を整えるものです。
src/pkg/syscall/zerrors_linux_386.go
, src/pkg/syscall/zerrors_linux_amd64.go
, src/pkg/syscall/zerrors_linux_arm.go
の変更
これらのファイルは、それぞれLinuxの32ビット(386)、64ビット(amd64)、ARMアーキテクチャ向けのシステムコール定数を定義しています。各ファイルにTCIFLUSH
、TCIOFLUSH
、TCOFLUSH
の3つの定数が追加され、それぞれ対応するC言語の定数値(0x0
, 0x2
, 0x1
)が割り当てられています。これらの定数がGoのsyscall
パッケージに明示的に定義されることで、Goプログラムはsyscall.TCIFLUSH
のようにこれらの定数を直接参照し、tcflush
システムコールなどのtermios
関連の操作を行う際に利用できるようになります。これにより、GoプログラムがターミナルI/Oバッファのフラッシュを制御する機能が提供されます。
関連リンク
- Go Issue #6355: https://github.com/golang/go/issues/6355
- Go CL 13660043: https://golang.org/cl/13660043
参考にした情報源リンク
- termios(3) - Linux man page: https://man7.org/linux/man-pages/man3/termios.3.html
- tcflush(3) - Linux man page: https://man7.org/linux/man-pages/man3/tcflush.3.html
- Go
syscall
package documentation: https://pkg.go.dev/syscall