シグナル

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

trap

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

trap 'command' signal-no [signal-no ...]
$ trap 'echo trapped.' 2
シグナル
シグナル 動作 キャッチ/無視
SIGHUP 終了
SIGINT 終了
SIGKILL 終了
SIGQUIT コア 不可

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();
}