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

[インデックス 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環境でシグナルを適切に処理できるようにするための、複数の側面からの変更を含んでいます。

  1. ビルドタグの追加: 多くの既存の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など)と共通のコードパスを使用できることを示しています。

  2. mksignals.shの更新: src/pkg/os/mksignals.shスクリプトにnetbsd_386netbsd_amd64が追加されました。このスクリプトは、Goがサポートする各OS/アーキテクチャの組み合わせに対して、シグナル定数を定義するGoソースファイルを自動生成する役割を担っています。この変更により、NetBSDの32ビット(i386)および64ビット(amd64)アーキテクチャ向けに、Goのosパッケージが使用するシグナル定義が生成されるようになります。

  3. 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つのカテゴリに分けられます。

  1. 既存ファイルのビルドタグへの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
    
  2. mksignals.shスクリプトへのNetBSDターゲットの追加:

    • src/pkg/os/mksignals.sh このシェルスクリプトにnetbsd_386netbsd_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
    
  3. 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をファーストクラスのサポート対象として認識し、その上でシグナル処理を適切に行えるようにすることです。

  1. ビルドタグの追加: Goのビルドタグは、条件付きコンパイルを可能にします。+build netbsdを既存のUnix系OS共通のファイルに追加することで、これらのファイルがNetBSD環境でもコンパイルされ、Goのosパッケージの基本的な機能(ディレクトリ操作、エラー処理、プロセス実行、ファイル操作など)がNetBSD上で利用可能になります。これは、NetBSDが他のUnix系OSと多くのAPIや挙動を共有しているため、既存の汎用Unixコードを再利用できることを意味します。

  2. mksignals.shの更新とシグナル定義ファイルの生成: mksignals.shは、Goのクロスプラットフォーム対応において重要な役割を果たすスクリプトです。OSごとにシグナルの数値定数が異なる場合があるため、手動でこれらの定数を管理するのはエラーの元となります。このスクリプトは、syscallパッケージ(OS固有のシステムコール定数を含む)から情報を抽出し、Goのosパッケージが使用するzsignal_*.goファイルを自動生成します。 netbsd_386netbsd_amd64mksignals.shに追加することで、GoのビルドプロセスはNetBSDの各アーキテクチャ向けに、そのOSが定義する正確なシグナル定数を含むzsignal_netbsd_386.gozsignal_netbsd_amd64.goファイルを生成するようになります。 これらの生成されたファイル(例: zsignal_netbsd_386.go)は、syscall.SIGABRTのようなOS固有のシグナル定数を、Goのosパッケージ内で使用されるUnixSignal型にキャストしてエクスポートします。これにより、Goプログラムはos.SIGABRTのようにプラットフォームに依存しない形でシグナルを参照できるようになり、内部的にはNetBSDの正しいシグナル番号にマッピングされます。

この一連の変更により、GoプログラムはNetBSD環境でシグナルを正確に解釈し、処理できるようになり、NetBSD上でのGoアプリケーションの安定性と互換性が向上します。

関連リンク

参考にした情報源リンク

  • 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環境でシグナルを適切に処理できるようにするための、複数の側面からの変更を含んでいます。

  1. ビルドタグの追加: 多くの既存の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など)と共通のコードパスを使用できることを示しています。

  2. mksignals.shの更新: src/pkg/os/mksignals.shスクリプトにnetbsd_386netbsd_amd64が追加されました。このスクリプトは、Goがサポートする各OS/アーキテクチャの組み合わせに対して、シグナル定数を定義するGoソースファイルを自動生成する役割を担っています。この変更により、NetBSDの32ビット(i386)および64ビット(amd64)アーキテクチャ向けに、Goのosパッケージが使用するシグナル定義が生成されるようになります。

  3. 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つのカテゴリに分けられます。

  1. 既存ファイルのビルドタグへの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
    
  2. mksignals.shスクリプトへのNetBSDターゲットの追加:

    • src/pkg/os/mksignals.sh このシェルスクリプトにnetbsd_386netbsd_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
    
  3. 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をファーストクラスのサポート対象として認識し、その上でシグナル処理を適切に行えるようにすることです。

  1. ビルドタグの追加: Goのビルドタグは、条件付きコンパイルを可能にします。+build netbsdを既存のUnix系OS共通のファイルに追加することで、これらのファイルがNetBSD環境でもコンパイルされ、Goのosパッケージの基本的な機能(ディレクトリ操作、エラー処理、プロセス実行、ファイル操作など)がNetBSD上で利用可能になります。これは、NetBSDが他のUnix系OSと多くのAPIや挙動を共有しているため、既存の汎用Unixコードを再利用できることを意味します。

  2. mksignals.shの更新とシグナル定義ファイルの生成: mksignals.shは、Goのクロスプラットフォーム対応において重要な役割を果たすスクリプトです。OSごとにシグナルの数値定数が異なる場合があるため、手動でこれらの定数を管理するのはエラーの元となります。このスクリプトは、syscallパッケージ(OS固有のシステムコール定数を含む)から情報を抽出し、Goのosパッケージが使用するzsignal_*.goファイルを自動生成します。 netbsd_386netbsd_amd64mksignals.shに追加することで、GoのビルドプロセスはNetBSDの各アーキテクチャ向けに、そのOSが定義する正確なシグナル定数を含むzsignal_netbsd_386.gozsignal_netbsd_amd64.goファイルを生成するようになります。 これらの生成されたファイル(例: zsignal_netbsd_386.go)は、syscall.SIGABRTのようなOS固有のシグナル定数を、Goのosパッケージ内で使用されるUnixSignal型にキャストしてエクスポートします。これにより、Goプログラムはos.SIGABRTのようにプラットフォームに依存しない形でシグナルを参照できるようになり、内部的にはNetBSDの正しいシグナル番号にマッピングされます。

この一連の変更により、GoプログラムはNetBSD環境でシグナルを正確に解釈し、処理できるようになり、NetBSD上でのGoアプリケーションの安定性と互換性が向上します。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • NetBSDの公式ドキュメント
  • Unix系OSのシグナルに関する一般的な情報源
  • Goのソースコードリポジトリ(特にsrc/pkg/osディレクトリ)
  • Goのコードレビューシステム(Gerrit)のCL(Change List): https://golang.org/cl/5492064 (コミットメッセージに記載されているリンク)
  • GitHubのコミット履歴
  • Wikipedia (シグナル、NetBSDなど)