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

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

このコミットは、Go言語のテストスイートにおけるSIGCHLDシグナルに関するテスト(test/sigchld.go)が、Plan 9オペレーティングシステム上でスキップされるように変更するものです。これにより、Plan 9環境でのテストの安定性と互換性が向上します。

コミット

commit 45893ebdb8c7644cb96e7da0d7457bcd55bfd54d
Author: David du Colombier <0intro@gmail.com>
Date:   Wed Jan 29 09:28:23 2014 +0100

    test: skip SIGCHLD test on Plan 9
    
    LGTM=bradfitz
    R=jas, mikioh.mikioh, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/51200045

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

https://github.com/golang/go/commit/45893ebdb8c7644cb96e7da0d7457bcd55bfd54d

元コミット内容

test: skip SIGCHLD test on Plan 9

このコミットの目的は、SIGCHLDシグナルに関連するテストをPlan 9オペレーティングシステム上で実行しないようにすることです。

変更の背景

この変更の背景には、Go言語のテストスイートが様々なオペレーティングシステム上で正しく動作することを確認する必要があるという点があります。SIGCHLDシグナルは、Unix系システムにおいて子プロセスの状態が変化した際に親プロセスに送信されるシグナルです。例えば、子プロセスが終了したり、停止したり、再開したりした場合に発生します。

しかし、Plan 9はUnixとは異なる設計思想を持つオペレーティングシステムであり、シグナル処理のメカニズムがUnix系システムとは異なります。そのため、UnixのSIGCHLDシグナルに依存するテストがPlan 9上で期待通りに動作しない、あるいは不適切な振る舞いを引き起こす可能性がありました。

このコミットは、Plan 9環境でのテストの失敗や誤動作を回避し、テストスイート全体の信頼性を向上させるために行われました。特定のOSに依存するテストをそのOSでスキップすることは、クロスプラットフォーム対応のソフトウェア開発において一般的なプラクティスです。

前提知識の解説

SIGCHLDシグナル

SIGCHLDは、Unix系オペレーティングシステム(Linux, macOS, BSDなど)で定義されている標準シグナルの一つです。このシグナルは、親プロセスがfork()システムコールなどによって生成した子プロセスの状態が変化した際に、カーネルによって親プロセスに送信されます。

SIGCHLDが送信される主なケースは以下の通りです。

  • 子プロセスの終了: 子プロセスが正常終了したか、異常終了(クラッシュなど)した場合。
  • 子プロセスの停止: 子プロセスがSIGSTOPSIGTSTPなどのシグナルによって停止した場合。
  • 子プロセスの再開: 停止していた子プロセスがSIGCONTシグナルによって再開した場合。

親プロセスはSIGCHLDシグナルを受け取ることで、子プロセスの状態変化を検知し、適切な処理を行うことができます。例えば、wait()waitpid()システムコールを使って子プロセスの終了ステータスを回収し、ゾンビプロセス化を防ぐといった処理が一般的です。

Plan 9オペレーティングシステム

Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。Unixの設計思想を継承しつつも、より一貫性のあるリソースのファイルシステム化、名前空間の概念、そして異なるマシン間でのリソース共有を重視した設計が特徴です。

Plan 9は、Unixとは異なる多くの点で設計されています。特に、プロセス間通信やイベント通知のメカニズムがUnixのシグナルとは異なります。Plan 9では、すべてのリソースがファイルとして表現され、プロセス間の通信もファイルシステムを介して行われることが一般的です。このため、UnixのSIGCHLDのようなシグナルベースの通知メカニズムは、Plan 9の設計哲学とは合致しません。

Go言語は、様々なプラットフォームで動作するように設計されており、Plan 9もそのターゲットの一つです。そのため、Goの標準ライブラリやテストスイートは、各プラットフォームの特性に合わせて調整される必要があります。

Go言語のビルドタグ(Build Tags)

Go言語には、特定のファイルが特定の環境でのみコンパイルされるように制御するための「ビルドタグ(Build Tags)」という機能があります。これは、ソースファイルの先頭に// +build tag_nameのようなコメントを記述することで実現されます。

  • // +build tag1,tag2: tag1tag2の両方が有効な場合にファイルがコンパイルされます。
  • // +build tag1 tag2: tag1またはtag2のいずれかが有効な場合にファイルがコンパイルされます。
  • // +build !tag: tagが有効でない場合にファイルがコンパイルされます。

このコミットでは、!plan9というビルドタグが使用されており、これは「Plan 9環境ではない場合」にこのファイルがコンパイルされることを意味します。

技術的詳細

このコミットは、test/sigchld.goファイルのビルドタグを変更することで、Plan 9環境でのコンパイルをスキップするようにしています。

元のコードでは、以下のビルドタグが記述されていました。

// +build !windows

これは、「Windows環境ではない場合」にこのファイルがコンパイルされることを意味していました。つまり、Unix系システム(Linux, macOSなど)ではコンパイルされ、SIGCHLDシグナルに関するテストが実行されていました。

このコミットによって、ビルドタグは以下のように変更されました。

// +build !plan9,!windows

この新しいビルドタグは、「Plan 9環境ではない、かつWindows環境ではない場合」にこのファイルがコンパイルされることを意味します。

論理的には、これは以下の条件でファイルがコンパイルされることを示します。 (NOT Plan 9) AND (NOT Windows)

これにより、test/sigchld.goは以下の環境でコンパイルされなくなります。

  • Plan 9: !plan9の条件が偽となるため。
  • Windows: !windowsの条件が偽となるため。

結果として、SIGCHLDシグナルに特化したテストは、Plan 9およびWindows環境では実行されなくなり、これらのOSでのテストの失敗や互換性の問題を回避できます。

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

変更されたファイル: test/sigchld.go

--- a/test/sigchld.go
+++ b/test/sigchld.go
@@ -1,4 +1,4 @@
-// +build !windows
+// +build !plan9,!windows
 // cmpout

 // Copyright 2009 The Go Authors. All rights reserved.

コアとなるコードの解説

変更はtest/sigchld.goファイルの最初の行にあるビルドタグのみです。

  • 変更前: // +build !windows

    • この行は、Goコンパイラに対して、このソースファイルがWindows以外のオペレーティングシステムでのみビルドされるべきであることを指示していました。つまり、LinuxやmacOSなどのUnix系システムではこのファイルがコンパイルされ、SIGCHLD関連のテストが実行されていました。
  • 変更後: // +build !plan9,!windows

    • この行は、Goコンパイラに対して、このソースファイルがPlan 9およびWindows以外のオペレーティングシステムでのみビルドされるべきであることを指示しています。
    • !plan9は「Plan 9ではない」という条件を意味し、!windowsは「Windowsではない」という条件を意味します。
    • カンマ,で区切られているため、これは論理AND条件として解釈されます。つまり、「Plan 9ではなく、かつWindowsでもない」場合にこのファイルがコンパイルされます。
    • これにより、Plan 9環境ではこのファイルがコンパイル対象から外され、SIGCHLDテストがスキップされるようになります。

この変更は、Goのクロスプラットフォーム対応戦略の一環であり、特定のOSの特性に合わないテストをそのOSで実行しないようにするための、シンプルかつ効果的な方法です。

関連リンク

参考にした情報源リンク