[インデックス 13832] ファイルの概要
このコミットは、GoランタイムにおけるFreeBSD環境でのSI_USER
シグナルコードの定義を修正するものです。具体的には、src/pkg/runtime/os_freebsd.h
ファイル内で定義されているSI_USER
の値が、FreeBSDの実際の定義と一致するように変更されています。
コミット
commit ecb2a0a9e521a0dd76ca70e00727fce9afbda687
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Mon Sep 17 01:08:41 2012 +0800
runtime: fix SI_USER for FreeBSD
Ref: http://svnweb.freebsd.org/base/head/sys/sys/signal.h?revision=HEAD&view=markup
R=golang-dev, devon.odell, r
CC=golang-dev
https://golang.org/cl/6490118
---
src/pkg/runtime/os_freebsd.h | 2 +-|
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pkg/runtime/os_freebsd.h b/src/pkg/runtime/os_freebsd.h
index 5e8de5434a..b440bfeec6 100644
--- a/src/pkg/runtime/os_freebsd.h
+++ b/src/pkg/runtime/os_freebsd.h
@@ -15,7 +15,7 @@ int32 runtime·sysctl(uint32*, uint32, byte*, uintptr*, byte*, uintptr);
void runtime·raisesigpipe(void);
#define NSIG 33
-#define SI_USER 0
+#define SI_USER 0x10001
#define RLIMIT_AS 10
typedef struct Rlimit Rlimit;
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ecb2a0a9e521a0dd76ca70e00727fce9afbda687
元コミット内容
runtime: fix SI_USER for FreeBSD
Ref: http://svnweb.freebsd.org/base/head/sys/sys/signal.h?revision=HEAD&view=markup
変更の背景
この変更の背景には、GoランタイムがFreeBSD上でシグナルを正しく処理するために、オペレーティングシステム(OS)固有の定数を正確に認識する必要があるという問題がありました。特に、SI_USER
というシグナルコードは、ユーザーが生成したシグナル(kill()
システムコールなどによって送信されるシグナル)を識別するために使用されます。
Goランタイムは、様々なOS上で動作するように設計されており、それぞれのOSのシステムコールや定数に合わせて調整されています。FreeBSDの場合、sys/sys/signal.h
ヘッダーファイルで定義されているSI_USER
の値が、Goランタイム内で誤って0
と定義されていました。しかし、FreeBSDの実際の定義は0x10001
でした。この不一致により、GoプログラムがFreeBSD上でシグナルを処理する際に、ユーザーが送信したシグナルを正しく識別できない、あるいは予期せぬ動作を引き起こす可能性がありました。
このコミットは、FreeBSDの公式なシグナル定義との整合性を確保し、GoランタイムがFreeBSD環境でより堅牢に動作するようにするために行われました。参照されているFreeBSDのsignal.h
のURLは、この値の正確な定義を確認するための情報源として提供されています。
前提知識の解説
シグナル (Signals)
シグナルは、Unix系OSにおいてプロセス間通信や非同期イベント通知のためのソフトウェア割り込みメカニズムです。プロセスは、特定のイベント(例:Ctrl+Cによる割り込み、不正なメモリアクセス、子プロセスの終了など)が発生した際に、カーネルからシグナルを受け取ります。シグナルを受け取ったプロセスは、デフォルトの動作(終了、コアダンプなど)を実行するか、事前に登録されたシグナルハンドラ関数を実行することができます。
siginfo_t
構造体とシグナルコード (Signal Codes)
シグナルがプロセスに送信される際、そのシグナルに関する追加情報がsiginfo_t
という構造体に格納されてシグナルハンドラに渡されることがあります。この構造体には、シグナルを送信したプロセスID、ユーザーID、そしてシグナルの原因を示す「シグナルコード」が含まれます。シグナルコードは、同じシグナル番号(例:SIGSEGV
)であっても、そのシグナルが発生した具体的な原因を区別するために使用されます。
SI_USER
SI_USER
は、siginfo_t
構造体のsi_code
フィールドに設定される可能性のあるシグナルコードの一つです。このコードは、シグナルがユーザープロセスによって明示的に生成され、kill()
システムコールやsigqueue()
システムコールなどによって送信されたことを示します。つまり、カーネル内部のイベント(例:ハードウェア例外)ではなく、別のユーザープロセスが意図的にシグナルを送信した場合に設定されます。
FreeBSDにおけるシグナル定義
FreeBSDは、Unix系OSの一つであり、そのシグナル処理のメカニズムはPOSIX標準に準拠しつつも、独自の拡張や実装の詳細を持っています。sys/sys/signal.h
は、FreeBSDシステムにおけるシグナル関連の定数や構造体が定義されているヘッダーファイルです。OSのバージョンやパッチレベルによって、これらの定数の具体的な値が異なる場合があります。Goランタイムのようなクロスプラットフォームなソフトウェアは、各OSのこれらの詳細に正確に対応する必要があります。
技術的詳細
このコミットの技術的な詳細は、GoランタイムがFreeBSDのシグナル処理メカニズムとどのように連携するかという点に集約されます。Goランタイムは、内部的にシグナルを処理し、Goルーチンにディスパッチする役割を担っています。この処理の正確性は、OSが提供するシグナル関連の定数や構造体の定義に依存します。
SI_USER
は、siginfo_t
構造体のsi_code
フィールドに設定される値であり、シグナルがユーザーによって生成されたことを示します。GoランタイムがFreeBSD上でシグナルを処理する際、si_code
の値をチェックして、シグナルの種類や発生源を特定することがあります。もしGoランタイムがFreeBSDのSI_USER
の正しい値を知らない場合、ユーザーが生成したシグナルを誤って解釈したり、全く認識できなかったりする可能性があります。これは、例えばGoプログラムがkill
コマンドによって終了させられた際に、その終了がユーザーによるものであることを正しく認識できない、といった問題につながりかねません。
元のコードでは、src/pkg/runtime/os_freebsd.h
において#define SI_USER 0
と定義されていました。これは、FreeBSDの実際のSI_USER
の値とは異なっていました。参照されているFreeBSDのsignal.h
のソースコード(http://svnweb.freebsd.org/base/head/sys/sys/signal.h?revision=HEAD&view=markup
)を確認すると、SI_USER
は0x10001
として定義されていることがわかります。
このコミットは、GoランタイムがFreeBSDのシグナル処理と完全に互換性を持つように、この不一致を修正しています。これにより、GoプログラムはFreeBSD環境でシグナルをより正確かつ堅牢に処理できるようになります。
コアとなるコードの変更箇所
--- a/src/pkg/runtime/os_freebsd.h
+++ b/src/pkg/runtime/os_freebsd.h
@@ -15,7 +15,7 @@ int32 runtime·sysctl(uint32*, uint32, byte*, uintptr*, byte*, uintptr);
void runtime·raisesigpipe(void);
#define NSIG 33
-#define SI_USER 0
+#define SI_USER 0x10001
#define RLIMIT_AS 10
typedef struct Rlimit Rlimit;
コアとなるコードの解説
変更はsrc/pkg/runtime/os_freebsd.h
ファイル内の1行のみです。
- 変更前:
#define SI_USER 0
- 変更後:
#define SI_USER 0x10001
この変更は、GoランタイムがFreeBSDシステムコールやシグナル処理と連携する際に使用するSI_USER
定数の値を修正しています。
#define
ディレクティブは、C言語(Goランタイムの一部はCで書かれているか、Cのヘッダーファイルを模倣している)において、シンボル定数を定義するために使用されます。この場合、SI_USER
というシンボルに特定の値を割り当てています。
変更前は、SI_USER
が0
として定義されていました。これは、FreeBSDのsys/sys/signal.h
で定義されている実際の値とは異なっていました。FreeBSDでは、SI_USER
は0x10001
という16進数の値を持つことが標準です。
この修正により、GoランタイムはFreeBSD上でシグナルを処理する際に、ユーザーが生成したシグナルを正しく識別できるようになります。例えば、siginfo_t
構造体のsi_code
フィールドをチェックしてシグナルの原因を判断するようなGoランタイム内部のロジックが、この正しい値に基づいて動作するようになります。これにより、FreeBSD上でのGoプログラムのシグナル処理の正確性と信頼性が向上します。
関連リンク
- FreeBSD
sys/sys/signal.h
の参照: http://svnweb.freebsd.org/base/head/sys/sys/signal.h?revision=HEAD&view=markup - Goの変更リスト (CL): https://golang.org/cl/6490118
参考にした情報源リンク
- FreeBSD signal.h source code
- Go issue tracker (related to CL 6490118)
- man 2 sigaction (FreeBSD) (一般的なシグナル処理に関する情報)
- man 2 kill (FreeBSD) (シグナル送信に関する情報)
- man 7 signal (Linux, for general signal concepts) (一般的なシグナル概念の理解のため)