シグナル

シグナルとは、プロセス間又はスレッド間で非同期イベントの発生を伝えるプロセス間通信であり、おもに割り込み処理をさせるために使用されている。

kill

シグナルの種類はUnixの種類により異なり、kill -lコマンドで確認することができる。

$ 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
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

killコマンドでプロセスにシグナルを送ることができる。

kill [options] pid ...

trap

bashシェル組み込みコマンドであるtrapを使って、送出されたシグナルを補足してコマンドを実行することができる。

trap 'command' signal-no [signal-no ...]
$ trap 'echo trapped.' 2

SIGHUP

ハングアップ(hangup)

擬似端末をクローズしたときに、その端末から起動されたプロセスグループに送られる。

デフォルトの動作

プロセスの異常終了

SIGINT

割り込み(interrupt)

端末から割り込みキー(Ctrl + C)を押下したときに発生する。

デフォルトの動作

プロセスの異常終了

SIGQUIT

終了(quit)

端末から終了キー(Ctrl + \)を押下したときに発生する。

デフォルトの動作

プロセスの異常終了とコアダンプの生成

SIGKILL

強制終了(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();
}