シグナル (シグナル) とは | 意味や読み方など丁寧でわかりやすい用語解説

作成日: 更新日:

シグナル (シグナル) の読み方

日本語表記

シグナル (シグナル)

英語表記

signal (シグナル)

シグナル (シグナル) の意味や用語解説

シグナルは、Unix/Linux系のオペレーティングシステムにおいて、プロセス間の非同期的な通信や、システムで発生したイベントをプロセスに通知するための重要な仕組みである。これは、プログラムの実行中に何らかの「合図」を送ることで、プロセスの動作を変更したり、終了させたりする役割を担う。例えば、ユーザーがプログラムの実行を中断したい時にキーボードでCtrl+Cを押すと、その操作はオペレーティングシステムによってシグナルに変換され、実行中のプロセスに送られる。プロセスはこのシグナルを受け取ることで、通常は終了する、といった一連の流れがある。シグナルは、プロセスが予期せぬエラーに遭遇した際や、他のプロセスからの制御を受けたい場合など、多岐にわたる場面で利用される基本的な機能であり、システムエンジニアがシステムを理解し、堅牢なアプリケーションを構築する上で不可欠な知識となる。 シグナルには番号と名前が割り当てられており、それぞれ特定の意味を持つ。例えば、プロセスを終了させるための`SIGTERM`(Terminate Signal)や、プログラムの実行を強制的に停止させる`SIGKILL`(Kill Signal)、ユーザーがプログラムに割り込みを行うための`SIGINT`(Interrupt Signal)などが代表的だ。これらのシグナルは、カーネル、他のプロセス、またはユーザーによって対象のプロセスに送信される。例えば、シェルから`kill`コマンドを使って特定のプロセスID(PID)にシグナルを送ったり、前述のCtrl+Cのようにターミナルからの入力によってシグナルが生成されたりする。プロセスはシグナルを受け取ると、そのシグナルに対してあらかじめ定められたデフォルトの動作を実行するか、あるいは自身で定義した特別な処理(シグナルハンドラ)を実行する。 デフォルトの動作にはいくつかのパターンがある。多くのシグナルはプロセスを終了させる。例えば、`SIGTERM`を受け取ったプロセスは、通常、自身を終了させるためのクリーンアップ処理(開いているファイルのクローズ、リソースの解放など)を行った上で終了する。一方、`SIGKILL`は非常に特殊で、プロセスはシグナルハンドラを設定してこのシグナルを捕獲したり無視したりすることができず、強制的に即座に終了させられる。これは、プロセスが暴走して応答しなくなった場合などに、システムを安定させるために用いられる最終手段だ。他にも、メモリの不正アクセスなど、深刻なエラーが発生した際に送られる`SIGSEGV`(Segmentation Violation)は、プロセスを終了させるだけでなく、その時点でのプロセスのメモリ内容をファイル(コアダンプ)として保存する動作を伴うことがある。これは、後からエラーの原因を解析するための重要な情報となる。また、`SIGSTOP`や`SIGTSTP`はプロセスを実行中に一時停止させるシグナルであり、ユーザーがCtrl+Zを押すと`SIGTSTP`が送られ、プロセスは停止状態に入る。 プロセスがシグナルを受け取った際の動作をカスタマイズするには、シグナルハンドラと呼ばれる特別な関数を定義し、それをOSに登録する。プログラマは`signal()`や`sigaction()`といったシステムコールを使って、特定のシグナルが届いた際にどの関数を実行するかを指定できる。シグナルハンドラは、プロセスが通常の実行フローとは別に、非同期に実行されるため、安全に処理を行うためにはいくつかの注意点がある。例えば、シグナルハンドラ内で実行できる関数は「非同期シグナルセーフ」と呼ばれる限られたものに限られる場合が多い。これは、シグナルハンドラがいつ、どのタイミングで実行されるか予測できないため、リエントラント性(再入可能性)がない関数を使うと、予期せぬデータ破壊やデッドロックを引き起こす可能性があるからだ。そのため、シグナルハンドラは通常、非常にシンプルな処理に留め、複雑な処理が必要な場合は、フラグを立ててメインルーチンに処理を委ねる、といった設計が一般的である。 シグナルは、プロセス間通信(IPC)の一種として分類されることもあるが、その主要な目的はデータ交換ではなく、「イベント通知」である。シグナル自体にはデータを含めることはできず、送られるのはシグナルの種類という情報のみだ。そのため、より複雑な情報のやり取りが必要な場合は、パイプ、ソケット、メッセージキュー、共有メモリといった他のIPCメカニズムが用いられる。シグナルは、これらのより重量級のIPC手段と組み合わせて、データ準備の完了やエラー発生の通知といった軽量なイベント通知の役割を果たすこともある。 システムエンジニアを目指す初心者にとって、シグナルは、単にプロセスを終了させる手段としてだけでなく、デーモンプロセス(バックグラウンドで動作するサービスプログラム)の制御や、堅牢なアプリケーションの設計において極めて重要な概念となる。例えば、デーモンプロセスは`SIGTERM`を受け取ると、正常にシャットダウン処理を行い、`SIGUSR1`や`SIGUSR2`(ユーザー定義シグナル)を受け取ると、設定ファイルを再読み込みする、といった動作を実装することが一般的である。これにより、システム管理者や他のプログラムは、デーモンを停止させずに設定を変更したり、状態を監視したりできる。また、子プロセスが終了した際に親プロセスに送られる`SIGCHLD`は、親プロセスが子プロセスの状態を適切に管理し、ゾンビプロセス化を防ぐために利用される。シグナルの適切な理解と利用は、安定した、信頼性の高いシステムを構築するための基礎となるのだ。

シグナル (シグナル) とは | 意味や読み方など丁寧でわかりやすい用語解説