シグナルとは、プロセス間又はスレッド間で非同期イベントの発生を伝えるプロセス間通信であり、おもに割り込み処理をさせるために使用されている。
bashシェル組み込みコマンドであるtrapを使って、送出されたシグナルを補足してコマンドを実行することができる。
trap 'command' signal-no [signal-no ...]
$ trap 'echo trapped.' 2
シグナル | 動作 | キャッチ/無視 |
---|---|---|
SIGHUP | 終了 | 可 |
SIGINT | 終了 | 可 |
SIGKILL | 終了 | 可 |
SIGQUIT | コア | 不可 |
ハングアップ(hangup)
擬似端末をクローズしたときに、その端末から起動されたプロセスグループに送られる。
プロセスを終了する。
割り込み(interrupt)
端末から割り込みキー(Ctrl + C)を押下したときに発生する。
プロセスを終了する。
終了(quit)
端末から終了キー(Ctrl + \)を押下したときに発生する。
コアダンプを生成して、プロセスを終了する。
強制終了(kill)
killコマンドなどで明示的に発生させる。キャッチ及び無視できないシグナル。
プロセスを終了する。
シグナルをキャッチして、独自の処理を実行することができる。
#include <stdio.h>
#include <signal.h>
void sigcatcher() {
printf("PID %d caught signal.¥n", getpid());
}
int main(void) {
pid_t ppid;
signal(SIGINT, sigcatcher);
if (fork() == 0) {
sleep(5);
ppid = getppid();
while(TRUE)
if (kill(ppid, SIGINT) == -1)
exit(1);
}
pause();
}