[インデックス 10858] ファイルの概要
このコミットは、Go言語のos
パッケージにおけるNetBSDサポートの強化に関するものです。具体的には、最近のシグナル変更に対応するため、NetBSD固有のシグナル定義を追加し、関連するビルドタグを更新しています。
コミット
commit 5030177ea3a216f2b333920f423cfff3d33805fc
Author: Christopher Nielsen <m4dh4tt3r@gmail.com>
Date: Sun Dec 18 02:29:18 2011 +1100
os: Add NetBSD support for recent signal changes.
Add NetBSD to mksignals.sh and generate files.
While we're here, also add netbsd to the +build list where appropriate.
R=golang-dev, jsing
CC=golang-dev
https://golang.org/cl/5492064
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5030177ea3a216f2b333920f423cfff3d33805fc
元コミット内容
os: Add NetBSD support for recent signal changes.
Add NetBSD to mksignals.sh and generate files.
While we're here, also add netbsd to the +build list where appropriate.
変更の背景
このコミットの主な背景は、Go言語のos
パッケージがNetBSDオペレーティングシステム上で、最新のシグナル処理メカニズムに適切に対応できるようにすることです。Goはクロスプラットフォーム対応を重視しており、様々なOSで一貫した動作を提供することを目指しています。シグナルは、プロセス間通信や非同期イベント処理においてOSがプロセスに通知する重要なメカニズムであり、OSごとにその定義や挙動が異なる場合があります。
Goの標準ライブラリ、特にos
パッケージは、ファイルシステム操作、プロセス管理、シグナル処理など、OS固有の機能へのインターフェースを提供します。これらの機能が特定のOSで正しく動作するためには、そのOSのシステムコールやデータ構造に合わせた実装が必要です。
このコミットが行われた2011年12月時点では、GoのNetBSDサポートがまだ成熟段階にあり、シグナル処理に関する特定の変更("recent signal changes")がNetBSD側で行われたか、あるいはGoがNetBSDのシグナル処理をより正確に扱う必要が生じたと考えられます。Goのビルドシステムは、各OS/アーキテクチャの組み合わせに対して適切なコードをコンパイルするために、ビルドタグ(+build
ディレクティブ)を使用します。また、シグナル定義のようなOS固有の定数は、スクリプトによって自動生成されることが一般的です。
したがって、この変更は、GoがNetBSD環境でより堅牢かつ正確に動作するための、重要な互換性および機能強化の一環として行われました。
前提知識の解説
1. Go言語のビルドタグ (+build
ディレクティブ)
Go言語では、ソースファイルの先頭に+build
ディレクティブを記述することで、特定の環境(OS、アーキテクチャ、Goバージョンなど)でのみそのファイルをコンパイルするように制御できます。これはクロスプラットフォーム開発において非常に重要な機能です。
例:
// +build linux,amd64
: LinuxかつAMD64アーキテクチャでのみコンパイル// +build darwin freebsd linux
: Darwin, FreeBSD, Linuxのいずれかでコンパイル
このコミットでは、既存のGoソースファイルにnetbsd
タグを追加することで、NetBSD環境でもこれらのファイルがコンパイル対象となるように変更しています。
2. Unix系OSにおけるシグナル
シグナル(Signal)は、Unix系オペレーティングシステムにおいて、プロセスに対して非同期にイベントを通知するソフトウェア割り込みの一種です。例えば、Ctrl+Cを押すとSIGINT
シグナルがプロセスに送られ、プロセスは通常終了します。他にも、以下のようなシグナルがあります。
SIGTERM
: プロセスを終了させるためのシグナル(graceful shutdownを促す)SIGKILL
: プロセスを強制終了させるシグナル(捕捉・無視・ブロック不可)SIGSEGV
: セグメンテーション違反(不正なメモリアクセス)SIGHUP
: 端末の切断、またはデーモンプロセスへの設定ファイル再読み込み指示
Go言語のos
パッケージは、これらのシグナルをGoプログラム内で扱えるように抽象化されたインターフェースを提供します。OSごとにシグナルの番号や意味が微妙に異なる場合があるため、Goは各OS向けに適切なシグナル定数を定義する必要があります。
3. NetBSD
NetBSDは、BSD系Unixライクなオープンソースのオペレーティングシステムです。その特徴は、非常に高い移植性(portability)にあります。NetBSDは、デスクトップPCから組み込みシステム、サーバー、さらには特殊なハードウェアまで、多種多様なプラットフォームで動作します。Go言語のようなクロスプラットフォームを志向する言語にとって、NetBSDのような多様な環境をサポートすることは、その汎用性と適用範囲を広げる上で重要です。
4. mksignals.sh
スクリプト
Goのソースコードベースでは、OS固有の定数や構造体、特にシグナル定義のようなものは、手動で記述するのではなく、スクリプトによって自動生成されることがよくあります。mksignals.sh
は、Goのos
パッケージ内でシグナル関連の定数定義ファイルを生成するためのシェルスクリプトであると推測されます。これにより、OSごとのシグナル番号の差異を吸収し、Goコードから一貫した方法でシグナルを扱えるようになります。
技術的詳細
このコミットは、Go言語のos
パッケージがNetBSD環境でシグナルを適切に処理できるようにするための、複数の側面からの変更を含んでいます。
-
ビルドタグの追加: 多くの既存のGoソースファイル(
src/pkg/os/dir_unix.go
,src/pkg/os/error_posix.go
,src/pkg/os/exec/lp_unix.go
,src/pkg/os/exec_posix.go
,src/pkg/os/exec_unix.go
,src/pkg/os/file_posix.go
,src/pkg/os/file_unix.go
,src/pkg/os/os_unix_test.go
,src/pkg/os/path_unix.go
,src/pkg/os/sys_bsd.go
,src/pkg/os/user/lookup_stubs.go
)の先頭にある+build
ディレクティブにnetbsd
が追加されています。これにより、これらのファイルがNetBSD環境でGoプログラムをビルドする際にコンパイル対象に含まれるようになります。これは、NetBSDが他のUnix系OS(Darwin, FreeBSD, Linux, OpenBSDなど)と共通のコードパスを使用できることを示しています。 -
mksignals.sh
の更新:src/pkg/os/mksignals.sh
スクリプトにnetbsd_386
とnetbsd_amd64
が追加されました。このスクリプトは、Goがサポートする各OS/アーキテクチャの組み合わせに対して、シグナル定数を定義するGoソースファイルを自動生成する役割を担っています。この変更により、NetBSDの32ビット(i386)および64ビット(amd64)アーキテクチャ向けに、Goのos
パッケージが使用するシグナル定義が生成されるようになります。 -
NetBSD固有のシグナル定義ファイルの追加:
src/pkg/os/zsignal_netbsd_386.go
src/pkg/os/zsignal_netbsd_amd64.go
これらのファイルは新規に追加されており、それぞれNetBSDの386およびamd64アーキテクチャにおけるシグナル定数を定義しています。ファイルの内容は、syscall
パッケージからインポートされたシグナル番号をUnixSignal
型にキャストして定数としてエクスポートしています。これらのファイルは、mksignals.sh
スクリプトによって自動生成されることを示すコメント(// MACHINE GENERATED; DO NOT EDIT
)が含まれています。これにより、NetBSDの特定のシグナル番号がGoのos
パッケージ内で正しく認識され、利用できるようになります。
これらの変更は、GoプログラムがNetBSD上でシグナルを捕捉、送信、処理する際に、OS固有の差異を吸収し、Goの抽象化されたシグナルインターフェースを通じて一貫した動作を保証するために不可欠です。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、主に以下の3つのカテゴリに分けられます。
-
既存ファイルのビルドタグへの
netbsd
の追加:src/pkg/os/dir_unix.go
src/pkg/os/error_posix.go
src/pkg/os/exec/lp_unix.go
src/pkg/os/exec_posix.go
src/pkg/os/exec_unix.go
src/pkg/os/file_posix.go
src/pkg/os/file_unix.go
src/pkg/os/os_unix_test.go
src/pkg/os/path_unix.go
src/pkg/os/sys_bsd.go
src/pkg/os/user/lookup_stubs.go
これらのファイルでは、// +build ...
行にnetbsd
が追加されています。
例:
src/pkg/os/dir_unix.go
--- a/src/pkg/os/dir_unix.go +++ b/src/pkg/os/dir_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin freebsd linux openbsd +// +build darwin freebsd linux netbsd openbsd package os
-
mksignals.sh
スクリプトへのNetBSDターゲットの追加:src/pkg/os/mksignals.sh
このシェルスクリプトにnetbsd_386
とnetbsd_amd64
が追加され、NetBSD向けのシグナル定義ファイルの生成がトリガーされるようになります。
--- a/src/pkg/os/mksignals.sh +++ b/src/pkg/os/mksignals.sh @@ -8,6 +8,8 @@ for targ in \ linux_386 \ linux_amd64 \ linux_arm \ +\tnetbsd_386 \ +\tnetbsd_amd64 \ openbsd_386 \ openbsd_amd64 \ ; do
-
NetBSD固有のシグナル定義ファイルの新規追加:
src/pkg/os/zsignal_netbsd_386.go
src/pkg/os/zsignal_netbsd_amd64.go
これらのファイルは、NetBSDの32ビットおよび64ビットアーキテクチャ用のシグナル定数を定義しています。これらはmksignals.sh
によって自動生成されるファイルです。
例:
src/pkg/os/zsignal_netbsd_386.go
(新規ファイル)// MACHINE GENERATED; DO NOT EDIT // To regenerate, run // ./mksignals.sh // which, for this file, will run // ./mkunixsignals.sh ../syscall/zerrors_netbsd_386.go package os import ( "syscall" ) var _ = syscall.Open // in case there are zero signals const ( SIGABRT = UnixSignal(syscall.SIGABRT) SIGALRM = UnixSignal(syscall.SIGALRM) SIGBUS = UnixSignal(syscall.SIGBUS) SIGCHLD = UnixSignal(syscall.SIGCHLD) SIGCONT = UnixSignal(syscall.SIGCONT) SIGEMT = UnixSignal(syscall.SIGEMT) SIGFPE = UnixSignal(syscall.SIGFPE) SIGHUP = UnixSignal(syscall.SIGHUP) SIGILL = UnixSignal(syscall.SIGILL) SIGINFO = UnixSignal(syscall.SIGINFO) SIGINT = UnixSignal(syscall.SIGINT) SIGIO = UnixSignal(syscall.SIGIO) SIGIOT = UnixSignal(syscall.SIGIOT) SIGKILL = UnixSignal(syscall.SIGKILL) SIGPIPE = UnixSignal(syscall.SIGPIPE) SIGPROF = UnixSignal(syscall.SIGPROF) SIGQUIT = UnixSignal(syscall.SIGQUIT) SIGSEGV = UnixSignal(syscall.SIGSEGV) SIGSTOP = UnixSignal(syscall.SIGSTOP) SIGSYS = UnixSignal(syscall.SIGSYS) SIGTERM = UnixSignal(syscall.SIGTERM) SIGTHR = UnixSignal(syscall.SIGTHR) SIGTRAP = UnixSignal(syscall.SIGTRAP) SIGTSTP = UnixSignal(syscall.SIGTSTP) SIGTTIN = UnixSignal(syscall.SIGTTIN) SIGTTOU = UnixSignal(syscall.SIGTTOU) SIGURG = UnixSignal(syscall.SIGURG) SIGUSR1 = UnixSignal(syscall.SIGUSR1) SIGUSR2 = UnixSignal(syscall.SIGUSR2) SIGVTALRM = UnixSignal(syscall.SIGVTALRM) SIGWINCH = UnixSignal(syscall.SIGWINCH) SIGXCPU = UnixSignal(syscall.SIGXCPU) SIGXFSZ = UnixSignal(syscall.SIGXFSZ) )
コアとなるコードの解説
このコミットの核となる変更は、Goのビルドシステムとos
パッケージがNetBSDをファーストクラスのサポート対象として認識し、その上でシグナル処理を適切に行えるようにすることです。
-
ビルドタグの追加: Goのビルドタグは、条件付きコンパイルを可能にします。
+build netbsd
を既存のUnix系OS共通のファイルに追加することで、これらのファイルがNetBSD環境でもコンパイルされ、Goのos
パッケージの基本的な機能(ディレクトリ操作、エラー処理、プロセス実行、ファイル操作など)がNetBSD上で利用可能になります。これは、NetBSDが他のUnix系OSと多くのAPIや挙動を共有しているため、既存の汎用Unixコードを再利用できることを意味します。 -
mksignals.sh
の更新とシグナル定義ファイルの生成:mksignals.sh
は、Goのクロスプラットフォーム対応において重要な役割を果たすスクリプトです。OSごとにシグナルの数値定数が異なる場合があるため、手動でこれらの定数を管理するのはエラーの元となります。このスクリプトは、syscall
パッケージ(OS固有のシステムコール定数を含む)から情報を抽出し、Goのos
パッケージが使用するzsignal_*.go
ファイルを自動生成します。netbsd_386
とnetbsd_amd64
をmksignals.sh
に追加することで、GoのビルドプロセスはNetBSDの各アーキテクチャ向けに、そのOSが定義する正確なシグナル定数を含むzsignal_netbsd_386.go
とzsignal_netbsd_amd64.go
ファイルを生成するようになります。 これらの生成されたファイル(例:zsignal_netbsd_386.go
)は、syscall.SIGABRT
のようなOS固有のシグナル定数を、Goのos
パッケージ内で使用されるUnixSignal
型にキャストしてエクスポートします。これにより、Goプログラムはos.SIGABRT
のようにプラットフォームに依存しない形でシグナルを参照できるようになり、内部的にはNetBSDの正しいシグナル番号にマッピングされます。
この一連の変更により、GoプログラムはNetBSD環境でシグナルを正確に解釈し、処理できるようになり、NetBSD上でのGoアプリケーションの安定性と互換性が向上します。
関連リンク
- Go言語のビルド制約(Build Constraints): https://pkg.go.dev/cmd/go#hdr-Build_constraints
- Go言語の
os
パッケージ: https://pkg.go.dev/os - Go言語の
syscall
パッケージ: https://pkg.go.dev/syscall - NetBSD公式サイト: https://www.netbsd.org/
- Unixシグナルに関するWikipedia記事: https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB_(Unix)
参考にした情報源リンク
- Go言語の公式ドキュメント
- NetBSDの公式ドキュメント
- Unix系OSのシグナルに関する一般的な情報源
- Goのソースコードリポジトリ(特に
src/pkg/os
ディレクトリ) - Goのコードレビューシステム(Gerrit)のCL(Change List): https://golang.org/cl/5492064 (コミットメッセージに記載されているリンク)
- GitHubのコミット履歴
- Wikipedia (シグナル、NetBSDなど)```markdown
[インデックス 10858] ファイルの概要
このコミットは、Go言語のos
パッケージにおけるNetBSDサポートの強化に関するものです。具体的には、最近のシグナル変更に対応するため、NetBSD固有のシグナル定義を追加し、関連するビルドタグを更新しています。
コミット
commit 5030177ea3a216f2b333920f423cfff3d33805fc
Author: Christopher Nielsen <m4dh4tt3r@gmail.com>
Date: Sun Dec 18 02:29:18 2011 +1100
os: Add NetBSD support for recent signal changes.
Add NetBSD to mksignals.sh and generate files.
While we're here, also add netbsd to the +build list where appropriate.
R=golang-dev, jsing
CC=golang-dev
https://golang.org/cl/5492064
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5030177ea3a216f2b333920f423cfff3d33805fc
元コミット内容
os: Add NetBSD support for recent signal changes.
Add NetBSD to mksignals.sh and generate files.
While we're here, also add netbsd to the +build list where appropriate.
変更の背景
このコミットの主な背景は、Go言語のos
パッケージがNetBSDオペレーティングシステム上で、最新のシグナル処理メカニズムに適切に対応できるようにすることです。Goはクロスプラットフォーム対応を重視しており、様々なOSで一貫した動作を提供することを目指しています。シグナルは、プロセス間通信や非同期イベント処理においてOSがプロセスに通知する重要なメカニズムであり、OSごとにその定義や挙動が異なる場合があります。
Goの標準ライブラリ、特にos
パッケージは、ファイルシステム操作、プロセス管理、シグナル処理など、OS固有の機能へのインターフェースを提供します。これらの機能が特定のOSで正しく動作するためには、そのOSのシステムコールやデータ構造に合わせた実装が必要です。
このコミットが行われた2011年12月時点では、GoのNetBSDサポートがまだ成熟段階にあり、シグナル処理に関する特定の変更("recent signal changes")がNetBSD側で行われたか、あるいはGoがNetBSDのシグナル処理をより正確に扱う必要が生じたと考えられます。Goのビルドシステムは、各OS/アーキテクチャの組み合わせに対して適切なコードをコンパイルするために、ビルドタグ(+build
ディレクティブ)を使用します。また、シグナル定義のようなOS固有の定数は、スクリプトによって自動生成されることが一般的です。
したがって、この変更は、GoがNetBSD環境でより堅牢かつ正確に動作するための、重要な互換性および機能強化の一環として行われました。
前提知識の解説
1. Go言語のビルドタグ (+build
ディレクティブ)
Go言語では、ソースファイルの先頭に+build
ディレクティブを記述することで、特定の環境(OS、アーキテクチャ、Goバージョンなど)でのみそのファイルをコンパイルするように制御できます。これはクロスプラットフォーム開発において非常に重要な機能です。
例:
// +build linux,amd64
: LinuxかつAMD64アーキテクチャでのみコンパイル// +build darwin freebsd linux
: Darwin, FreeBSD, Linuxのいずれかでコンパイル
このコミットでは、既存のGoソースファイルにnetbsd
タグを追加することで、NetBSD環境でもこれらのファイルがコンパイル対象となるように変更しています。
2. Unix系OSにおけるシグナル
シグナル(Signal)は、Unix系オペレーティングシステムにおいて、プロセスに対して非同期にイベントを通知するソフトウェア割り込みの一種です。例えば、Ctrl+Cを押すとSIGINT
シグナルがプロセスに送られ、プロセスは通常終了します。他にも、以下のようなシグナルがあります。
SIGTERM
: プロセスを終了させるためのシグナル(graceful shutdownを促す)SIGKILL
: プロセスを強制終了させるシグナル(捕捉・無視・ブロック不可)SIGSEGV
: セグメンテーション違反(不正なメモリアクセス)SIGHUP
: 端末の切断、またはデーモンプロセスへの設定ファイル再読み込み指示
Go言語のos
パッケージは、これらのシグナルをGoプログラム内で扱えるように抽象化されたインターフェースを提供します。OSごとにシグナルの番号や意味が微妙に異なる場合があるため、Goは各OS向けに適切なシグナル定数を定義する必要があります。
3. NetBSD
NetBSDは、BSD系Unixライクなオープンソースのオペレーティングシステムです。その特徴は、非常に高い移植性(portability)にあります。NetBSDは、デスクトップPCから組み込みシステム、サーバー、さらには特殊なハードウェアまで、多種多様なプラットフォームで動作します。Go言語のようなクロスプラットフォームを志向する言語にとって、NetBSDのような多様な環境をサポートすることは、その汎用性と適用範囲を広げる上で重要です。
4. mksignals.sh
スクリプト
Goのソースコードベースでは、OS固有の定数や構造体、特にシグナル定義のようなものは、手動で記述するのではなく、スクリプトによって自動生成されることがよくあります。mksignals.sh
は、Goのos
パッケージ内でシグナル関連の定数定義ファイルを生成するためのシェルスクリプトであると推測されます。これにより、OSごとのシグナル番号の差異を吸収し、Goコードから一貫した方法でシグナルを扱えるようになります。
技術的詳細
このコミットは、Go言語のos
パッケージがNetBSD環境でシグナルを適切に処理できるようにするための、複数の側面からの変更を含んでいます。
-
ビルドタグの追加: 多くの既存のGoソースファイル(
src/pkg/os/dir_unix.go
,src/pkg/os/error_posix.go
,src/pkg/os/exec/lp_unix.go
,src/pkg/os/exec_posix.go
,src/pkg/os/exec_unix.go
,src/pkg/os/file_posix.go
,src/pkg/os/file_unix.go
,src/pkg/os/os_unix_test.go
,src/pkg/os/path_unix.go
,src/pkg/os/sys_bsd.go
,src/pkg/os/user/lookup_stubs.go
)の先頭にある+build
ディレクティブにnetbsd
が追加されています。これにより、これらのファイルがNetBSD環境でGoプログラムをビルドする際にコンパイル対象に含まれるようになります。これは、NetBSDが他のUnix系OS(Darwin, FreeBSD, Linux, OpenBSDなど)と共通のコードパスを使用できることを示しています。 -
mksignals.sh
の更新:src/pkg/os/mksignals.sh
スクリプトにnetbsd_386
とnetbsd_amd64
が追加されました。このスクリプトは、Goがサポートする各OS/アーキテクチャの組み合わせに対して、シグナル定数を定義するGoソースファイルを自動生成する役割を担っています。この変更により、NetBSDの32ビット(i386)および64ビット(amd64)アーキテクチャ向けに、Goのos
パッケージが使用するシグナル定義が生成されるようになります。 -
NetBSD固有のシグナル定義ファイルの追加:
src/pkg/os/zsignal_netbsd_386.go
src/pkg/os/zsignal_netbsd_amd64.go
これらのファイルは新規に追加されており、それぞれNetBSDの386およびamd64アーキテクチャにおけるシグナル定数を定義しています。ファイルの内容は、syscall
パッケージからインポートされたシグナル番号をUnixSignal
型にキャストして定数としてエクスポートしています。これらのファイルは、mksignals.sh
スクリプトによって自動生成されることを示すコメント(// MACHINE GENERATED; DO NOT EDIT
)が含まれています。これにより、NetBSDの特定のシグナル番号がGoのos
パッケージ内で正しく認識され、利用できるようになります。
これらの変更は、GoプログラムがNetBSD上でシグナルを捕捉、送信、処理する際に、OS固有の差異を吸収し、Goの抽象化されたシグナルインターフェースを通じて一貫した動作を保証するために不可欠です。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、主に以下の3つのカテゴリに分けられます。
-
既存ファイルのビルドタグへの
netbsd
の追加:src/pkg/os/dir_unix.go
src/pkg/os/error_posix.go
src/pkg/os/exec/lp_unix.go
src/pkg/os/exec_posix.go
src/pkg/os/exec_unix.go
src/pkg/os/file_posix.go
src/pkg/os/file_unix.go
src/pkg/os/os_unix_test.go
src/pkg/os/path_unix.go
src/pkg/os/sys_bsd.go
src/pkg/os/user/lookup_stubs.go
これらのファイルでは、// +build ...
行にnetbsd
が追加されています。
例:
src/pkg/os/dir_unix.go
--- a/src/pkg/os/dir_unix.go +++ b/src/pkg/os/dir_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin freebsd linux openbsd +// +build darwin freebsd linux netbsd openbsd package os
-
mksignals.sh
スクリプトへのNetBSDターゲットの追加:src/pkg/os/mksignals.sh
このシェルスクリプトにnetbsd_386
とnetbsd_amd64
が追加され、NetBSD向けのシグナル定義ファイルの生成がトリガーされるようになります。
--- a/src/pkg/os/mksignals.sh +++ b/src/pkg/os/mksignals.sh @@ -8,6 +8,8 @@ for targ in \ linux_386 \ linux_amd64 \ linux_arm \ +\tnetbsd_386 \ +\tnetbsd_amd64 \ openbsd_386 \ openbsd_amd64 \ ; do
-
NetBSD固有のシグナル定義ファイルの新規追加:
src/pkg/os/zsignal_netbsd_386.go
src/pkg/os/zsignal_netbsd_amd64.go
これらのファイルは、NetBSDの32ビットおよび64ビットアーキテクチャ用のシグナル定数を定義しています。これらはmksignals.sh
によって自動生成されるファイルです。
例:
src/pkg/os/zsignal_netbsd_386.go
(新規ファイル)// MACHINE GENERATED; DO NOT EDIT // To regenerate, run // ./mksignals.sh // which, for this file, will run // ./mkunixsignals.sh ../syscall/zerrors_netbsd_386.go package os import ( "syscall" ) var _ = syscall.Open // in case there are zero signals const ( SIGABRT = UnixSignal(syscall.SIGABRT) SIGALRM = UnixSignal(syscall.SIGALRM) SIGBUS = UnixSignal(syscall.SIGBUS) SIGCHLD = UnixSignal(syscall.SIGCHLD) SIGCONT = UnixSignal(syscall.SIGCONT) SIGEMT = UnixSignal(syscall.SIGEMT) SIGFPE = UnixSignal(syscall.SIGFPE) SIGHUP = UnixSignal(syscall.SIGHUP) SIGILL = UnixSignal(syscall.SIGILL) SIGINFO = UnixSignal(syscall.SIGINFO) SIGINT = UnixSignal(syscall.SIGINT) SIGIO = UnixSignal(syscall.SIGIO) SIGIOT = UnixSignal(syscall.SIGIOT) SIGKILL = UnixSignal(syscall.SIGKILL) SIGPIPE = UnixSignal(syscall.SIGPIPE) SIGPROF = UnixSignal(syscall.SIGPROF) SIGQUIT = UnixSignal(syscall.SIGQUIT) SIGSEGV = UnixSignal(syscall.SIGSEGV) SIGSTOP = UnixSignal(syscall.SIGSTOP) SIGSYS = UnixSignal(syscall.SIGSYS) SIGTERM = UnixSignal(syscall.SIGTERM) SIGTHR = UnixSignal(syscall.SIGTHR) SIGTRAP = UnixSignal(syscall.SIGTRAP) SIGTSTP = UnixSignal(syscall.SIGTSTP) SIGTTIN = UnixSignal(syscall.SIGTTIN) SIGTTOU = UnixSignal(syscall.SIGTTOU) SIGURG = UnixSignal(syscall.SIGURG) SIGUSR1 = UnixSignal(syscall.SIGUSR1) SIGUSR2 = UnixSignal(syscall.SIGUSR2) SIGVTALRM = UnixSignal(syscall.SIGVTALRM) SIGWINCH = UnixSignal(syscall.SIGWINCH) SIGXCPU = UnixSignal(syscall.SIGXCPU) SIGXFSZ = UnixSignal(syscall.SIGXFSZ) )
コアとなるコードの解説
このコミットの核となる変更は、Goのビルドシステムとos
パッケージがNetBSDをファーストクラスのサポート対象として認識し、その上でシグナル処理を適切に行えるようにすることです。
-
ビルドタグの追加: Goのビルドタグは、条件付きコンパイルを可能にします。
+build netbsd
を既存のUnix系OS共通のファイルに追加することで、これらのファイルがNetBSD環境でもコンパイルされ、Goのos
パッケージの基本的な機能(ディレクトリ操作、エラー処理、プロセス実行、ファイル操作など)がNetBSD上で利用可能になります。これは、NetBSDが他のUnix系OSと多くのAPIや挙動を共有しているため、既存の汎用Unixコードを再利用できることを意味します。 -
mksignals.sh
の更新とシグナル定義ファイルの生成:mksignals.sh
は、Goのクロスプラットフォーム対応において重要な役割を果たすスクリプトです。OSごとにシグナルの数値定数が異なる場合があるため、手動でこれらの定数を管理するのはエラーの元となります。このスクリプトは、syscall
パッケージ(OS固有のシステムコール定数を含む)から情報を抽出し、Goのos
パッケージが使用するzsignal_*.go
ファイルを自動生成します。netbsd_386
とnetbsd_amd64
をmksignals.sh
に追加することで、GoのビルドプロセスはNetBSDの各アーキテクチャ向けに、そのOSが定義する正確なシグナル定数を含むzsignal_netbsd_386.go
とzsignal_netbsd_amd64.go
ファイルを生成するようになります。 これらの生成されたファイル(例:zsignal_netbsd_386.go
)は、syscall.SIGABRT
のようなOS固有のシグナル定数を、Goのos
パッケージ内で使用されるUnixSignal
型にキャストしてエクスポートします。これにより、Goプログラムはos.SIGABRT
のようにプラットフォームに依存しない形でシグナルを参照できるようになり、内部的にはNetBSDの正しいシグナル番号にマッピングされます。
この一連の変更により、GoプログラムはNetBSD環境でシグナルを正確に解釈し、処理できるようになり、NetBSD上でのGoアプリケーションの安定性と互換性が向上します。
関連リンク
- Go言語のビルド制約(Build Constraints): https://pkg.go.dev/cmd/go#hdr-Build_constraints
- Go言語の
os
パッケージ: https://pkg.go.dev/os - Go言語の
syscall
パッケージ: https://pkg.go.dev/syscall - NetBSD公式サイト: https://www.netbsd.org/
- Unixシグナルに関するWikipedia記事: https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB_(Unix)
参考にした情報源リンク
- Go言語の公式ドキュメント
- NetBSDの公式ドキュメント
- Unix系OSのシグナルに関する一般的な情報源
- Goのソースコードリポジトリ(特に
src/pkg/os
ディレクトリ) - Goのコードレビューシステム(Gerrit)のCL(Change List): https://golang.org/cl/5492064 (コミットメッセージに記載されているリンク)
- GitHubのコミット履歴
- Wikipedia (シグナル、NetBSDなど)