Linux において、シグナルとは、重要なイベントが発生したことをプロセスに通知するために送信されるソフトウェア割り込みです。Linux シグナルを理解することは、プロセスとシステム動作を効果的に管理するための基本となります。
シグナルの目的
シグナルは、プロセス間通信(IPC)の主要な手段として機能します。その用途は多岐にわたります。
- ユーザー操作: ユーザーは、フォアグラウンドプロセスを中断または一時停止するために、
Ctrl-C(SIGINT) やCtrl-Z(SIGTSTP) のような特殊なターミナル文字を入力できます。 - カーネル通知: カーネルは、不正なメモリアクセス (SIGSEGV) のようなハードウェアまたはソフトウェアの問題を通知するために、プロセスにシグナルを送信できます。
- プロセス管理: システム管理者や他のプロセスは、プロセスの終了要求や設定の再読み込みなど、他のプロセスのライフサイクルを管理するためにシグナルを使用します。
シグナルのライフサイクル
シグナルを生成するイベントが発生すると、まずターゲットプロセスに配信されます。シグナルは、カーネルがプロセスを実行するまで「保留中」の状態にとどまります。プロセスがスケジューリングされると、シグナルが配信されます。ただし、プロセスには特定のシグナルの配信をブロックするように設定できるシグナルマスクがあります。
シグナルが配信されると、プロセスはいくつかの動作のいずれかを選択できます。
- シグナルを無視: プロセスはシグナルを破棄し、実行を続行します。
- シグナルをキャッチ: プロセスは、イベントに応答するためにシグナルハンドラと呼ばれるカスタム関数を実行します。
- デフォルトアクションの実行: キャッチも無視もされない場合、デフォルトのアクションが実行されます。多くのシグナルでは、これはプロセスの終了を意味します。
- シグナルをブロック: シグナルがプロセスのシグナルマスク内にある場合、ブロックが解除されるまで保留状態のままになります。
一般的な Linux プロセスシグナル
各シグナルは整数で定義されますが、ほとんどの場合、SIGで始まるシンボル名(OS シグナルコード)で参照されます。数値はアーキテクチャによって若干異なる場合がありますが、名前は一貫しています。最も一般的なLinux プロセスシグナルをいくつか紹介します。
- SIGHUP (1): ハングアップ。デーモンに設定ファイルを再読み込みするように伝えるためによく使用されます。
- SIGINT (2): 中断。
Ctrl-Cによって送信されます。プロセスを終了するための要求です。 - SIGKILL (9): キル。これは即時かつ強制的な終了です。プロセスはこのシグナルをキャッチ、無視、またはブロックすることはできません。
- SIGSEGV (11): セグメンテーション違反。プロセスが無効なメモリアクセスを行ったことを示します。
- SIGTERM (15): 終了。これはプロセスに終了を依頼する標準的で丁寧な方法です。
killコマンドによって送信されるデフォルトのシグナルです。プロセスは終了前にクリーンアップを実行するためにこのシグナルをキャッチできます。これはしばしばシグナル 15 Linuxと呼ばれます。 - SIGSTOP: 停止。プロセスを一時停止します。SIGKILL と同様に、キャッチしたり無視したりすることはできません。
SIGTERM(Linux シグナル 15)とSIGKILLの主な違いは、SIGTERMが処理可能な要求であるのに対し、SIGKILLはプロセスを即座に破壊するコマンドであるという点です。