デフォルトハンドラだけのプロセスにシグナルを送信する
それでは、プロセスを1つ起動して、それにシグナルを送信する方法と、受信したプロセスの動作を確認しましょう。まずは、受信するプロセスのプログラムが独自のシグナルハンドラを登録していない場合からです。
シグナルを受信させるプロセスのプログラムコードを次に示します。何もせず、単に無限ループする(いつまでも終了しない)だけのプログラムです。独自のシグナルハンドラを登録していないため、どのシグナルを受信してもデフォルトのシグナルハンドラ(デフォルトハンドラ)が実行されます。
(▼viエディタでC言語プログラムmyApp-1.cを作成) $ vi myApp-1.c main(){ while(1) {}; } (▼myApp-1.cをコンパイルして実行プログラム myApp-1 を作成) $ make myApp-1 (▼myApp-1を実行。無限ループで終了しない) $ ./myApp-1
killコマンド(試験での重要度:★★★)
kill
コマンドは、指定したシグナルを指定したプロセスに送信します。kill
コマンドの基本構文は次のとおりです。
kill [-s] [シグナル名 | シグナル番号] プロセスID kill [-s] [シグナル名 | シグナル番号] %ジョブID kill -l
オプション | 説明 |
---|---|
-s | 送信するシグナルを指定。省略可能 |
-l | シグナル名の一覧を表示 |
実行例1:シグナル一覧の表示
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM ...(以下省略)...
実行例2:デフォルトハンドラが設定されたプロセスmyApp-1にSIGHUPシグナルを送信する(①~④は実行および表示の順番)
受信側 | 送信側 |
---|---|
$ ./myApp-1 –① Hangup –④ |
$ pgrep myApp-1 –② 20082 $ kill -SIGHUP 20082 –③ |
実行例3:デフォルトハンドラが設定されたジョブ番号1のプロセスmyApp-1にSIGTERMシグナルを送信する
$ ./myApp-1 & [1] 20889 $ kill %1 [1]+ Terminated ./myApp-1
実行例4:プロセスmyApp-1にSIGKILLシグナルを送信する(①~④は実行および表示の順番)
受信側 | 送信側 |
---|---|
$ ./myApp-1 --➀ Killed --④ |
$ pgrep myApp-1 --② 20082 $ kill -9 20082 --③ |
killallコマンド(試験での重要度:★★★)
killall
コマンドは指定した名前のすべてのプロセスにシグナルを送信します。killall
コマンドの基本構文は次のとおりです。
killall [-s] [シグナル名 | シグナル番号] プロセス名
実行例5:プロセスmyApp-1にSIGHUPシグナルを送信する
$ killall -s HUP myApp-1
pkillコマンド(試験での重要度:★★)
pkill
コマンドは、killall
コマンドと同じく指定した名前のすべてのプロセスにシグナルを送信します。ただし、killall
コマンドとは構文が若干異なります。pkill
コマンドの基本構文は次のとおりです。
pkill [--signal] [シグナル名 | シグナル番号] プロセス名
実行例6:プロセスmyApp-1にSIGINT(シグナル番号2)を送信する
$ pkill -2 myApp-1