独自のシグナルハンドラが登録されたプロセスにシグナルを送信する
今度は、独自のシグナルハンドラが登録されたプロセスにシグナルを送信した場合を見てみましょう。シグナルを受信させるプロセスのプログラムコードは、次のとおりです。SIGHUP、SIGINT、SIGTERMという3つのシグナルのハンドラが登録されています。動作イメージも図にして掲載しておきます。
(▼viエディタでC言語プログラムmyApp-2.cを作成)
$ vi myApp-2.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void my_default();
void my_term();
int main(void)
{
signal(SIGHUP, my_default); //SIGHUP受信時のハンドラmy_defaultを登録
signal(SIGINT, my_default); //SIGINT受信時のハンドラmy_defaultを登録
signal(SIGTERM, my_term); //SIGTERM受信時のハンドラmy_termを登録
while(1) {}; //無限ループ
}
void my_default(int sig) //SIGHUPあるいはSIGINT受信時に呼び出される
{
//シグナル番号とともにシグナルを受信した旨のメッセージを表示
printf("signal %d received.\n", sig);
return;
}
void my_term(int sig) //SIGTERM受信時に呼び出される
{
//シグナル番号とともにシグナルを受信した旨のメッセージを表示
printf("signal %d received. Terminating...\n", sig);
exit(0); //プログラムを終了する
}
(▼myApp-2.cをコンパイルして実行プログラム myApp-2 を作成)
$ make myApp-2
(▼myApp-2を実行)
$ ./myApp-2
実行例7:myApp-2にSIGHUP、SIGINT、SIGTERMシグナルを順に送信
| 受信側 | 送信側 |
|---|---|
$ ./myApp-2 signal 1 received. signal 2 received. signal 15 received. Terminating... |
$ killall -s HUP myApp-2 $ killall -s INT myApp-2 $ killall myApp-2 |
プロセスにどのようなシグナルハンドラが登録されているかは、/proc/プロセスID/statusファイルの内容を調べることで確認できます。/proc/プロセスID/statusファイルの中の「SigCgt」(Signal Caughtの短縮)エントリは、シグナルハンドラの登録により捕捉されるシグナルの16進数でのビットマップです。左端がMSB(Most Significant Bit)、 右端がLSB(Least Significant Bit)となっています。
myApp-1のように独自のシグナルハンドラの登録されていない、デフォルトハンドラのみの場合、SigCgtの値はオール0になります。
$ grep SigCgt /proc/`pidof myApp-1`/status SigCgt: 0000000000000000
一方、myApp-2のようにSIGHUP、SIGINT、SIGTERMのシグナルハンドラが登録されたプロセスの場合、SigCgtの値は次のようになります。
$ grep SigCgt /proc/`pidof myApp-2`/status SigCgt: 0000000000004003 (▼bcコマンドで16進数を2進数に変換) $ echo "obase=2; ibase=16; 4003" |bc 100000000000011
2進数に変換した値10000 00000 00011から、左から15、2、1の各ビットが立っていることが分かります。

