Shoeisha Technology Media

資格Zine(しかくジン)

記事種別から探す

【LPICレベル1】弱点「シグナルによるプロセスの制御」を克服する

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 Linuxでは終了メニューの選択や、内部処理が完了することでプロセスは終了しますが、killコマンドによるシグナル送信でも外部から終了できます。また、サーバプロセスに特定のシグナルを送信することで、設定ファイルの再読み込みやデータのダンプなどを行わせることができます。このようにシグナル送信によるプロセスの制御は、システムを管理をする上で大切な要素です。LPICレベル1試験でも、killコマンドやキーボード操作によるシグナル送信は「主題103 GNUとUnixのコマンド」で重要度4に指定されており、試験対策として理解必須の事項です。

シグナルによるプロセスの制御の仕組み

「シグナル」とは、割り込みによってプロセスに特定の動作をするように通知するための仕組みです。シグナルを受信したプロセスは、シグナルに応じた処理を実行します。シグナルを受信したときに実行する処理は、プログラムの中に関数として登録しておくことができます。この関数のことを「シグナルハンドラ」と呼びます。受信したシグナルに対応するシグナルハンドラがプロセスに登録されていない場合には、デフォルトのシグナルハンドラが実行されます。

プロセスの間でシグナルを送受信したときの動作イメージは次図のとおりです。図では、プロセス終了を意味するSIGTERMシグナルを送受信したときの様子を表しています。

プロセスの間でシグナルを送受信したときの動作イメージ
プロセスの間でシグナルを送受信したときの動作イメージ

シグナルにはたくさんの種類があります。主なものは次表のとおりです。送信するシグナルは「シグナル名」で指定しますが、実際に送信されるのは「シグナル番号」です。シグナルを受信するプロセスも、どのシグナルが届いたのかはシグナル番号で判別します。「動作」はデフォルトのハンドラが行う処理です。「表示メッセージ」は、デフォルトのハンドラが実行されたときに表示されるメッセージです。

Linuxの主なシグナル
シグナル番号 シグナル名 動作 表示メッセージ 説明 試験での重要度
1 SIGHUP 終了 Hangup 制御ターミナルのハングアップまたは制御プロセスの消滅 ★★★
2 SIGINT 終了 (表示なし) キーボード操作による割り込み(Ctrl+c) ★★★
3 SIGQUIT 終了+コアダンプ Quit (core dumped) キーボード操作による終了(Ctrl+\) -
9 SIGKILL 強制終了 Killed 強制終了 ★★★
11 SIGSEGV 終了+コアダンプ Segmentation fault (core dumped) 不正なメモリ参照 -
15 SIGTERM 終了 Terminated 終了 ★★★
18 SIGCONT 実行再開 (表示なし) 一時停止プロセスの再開 -
19 SIGSTOP 強制一時停止 (表示なし) 強制一時停止 -
20 SIGTSTP 一時停止 (表示なし) キーボード操作による一時停止(Ctrl+z) -

なお、SIGCONTSIGSTOPSIGTSTPの各シグナルは、CPUアーキテクチャによってシグナル番号が異なります。この表はx86アーキテクチャの場合の番号です。

シグナルの送信

シグナルは、killkillallpkillコマンドで送信できます。コマンドには送信するシグナルを指定しますが、指定を省略した場合にはSIGTERMシグナルが送信されます。また、指定するシグナル名では先頭の「SIG」を省略できます。例えば、SIGHUPシグナルは「HUP」、SIGINTシグナルは「INT」と書くことができます。

フォアグラウンドプロセスに対しては、上記の表のとおり、Ctrl+c、Ctrl+\、Ctrl+zの各キーボード操作によりシグナルを送信できます。

シグナルの受信

本稿の冒頭でも述べたとおり、シグナルを受信したプロセスに該当するシグナルハンドラが登録されていない場合には、デフォルトのシグナルハンドラが実行されます。ハンドラ名は「SIG_DFL」です。

シグナルハンドラの登録には、signal()sigacton()というシステムコール(カーネルの処理を呼び出すC言語の関数)が利用できます。それぞれ次のように使います。

  • signal()は引数にシグナルとハンドラを指定して実行します(後述のプログラム例2を参照)
  • sigacton()は引数にシグナルと、シグナルハンドラを要素に含むsigaction構造体を指定して実行します(後述のhttpdとnamedの例を参照)
  • signal()の動作はシステムによって異なるため、移植性が必要な場合はsigacton()を使うことが推奨されています。

プログラムの中で独自にシグナルハンドラを登録することにより、上記の表とは異なる機能を持たせることもできます。ただし、SIGKILLは強制的に終了させるための、SIGSTOPは強制的に一時停止させるための特別なシグナルであり、プロセスはこれら2つのシグナルだけは捕捉できないため、プロセス自身の中で処理をすることができません。

プロセスが送信したシグナルは、カーネルを経由して送信先のプロセスに配信されます。ただし、SIGKILLSIGSTOPは送信先プロセスに配信されることなく、カーネルによって強制的な終了あるいは一時停止の処理が行われます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 大竹 龍史(有限会社ナレッジデザイン)(オオタケ リュウシ)

    有限会社ナレッジデザイン 代表取締役。

    1986年 伊藤忠データシステム(現・伊藤忠テクノソリューションズ(株))入社後、Sun Microsystems社のSunUNIX 3.x、SunOS 4.x、Solaris 2.xを皮切りにOSを中心としたサポートと社内トレーニングを担当。

    1998年 (有)ナレッジデザイン設立。Linux、Solarisの講師および、LPI対応コースの開発/実施。約27年にわたり、OS の中核部分のコンポーネントを中心に、UNIX/Solaris、Linuxなどオペレーティングシステムの研修を主に担当。最近はOpenStack関連の検証とドキュメント作成に注力。

    著書に『Linux教科書 LPIC レベル1 スピードマスター問題集』(共著、翔泳社刊)、『Linux教科書 LPIC レベル2 スピードマスター問題集』(翔泳社刊)。月刊誌『日経Linux』(日経BP社刊)およびWebメディア『@IT自分戦略研究所』(ITmedia)でLPIC対策記事を連載。

バックナンバー

連載:ドラゴン大竹のLPICレベル1 弱点克服クラス(Ver 4対応)
All contents copyright © 2015-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.0