[C言語]シグナルをキャッチする サンプルコード



シグナルとは

いわゆる「割り込み」の1つ。動いてるプロセスに対して、他のプロセスから信号を送ることが出来る。

代表的なシグナル

シグナル番号 シグナル名 説明
1 SIGHUP デーモンプロセスに設定の再読み込みをさせるのに良く利用される
2 SIGINT キーボードからの割り込み(Ctrl-C)
9 SIGKILL Kill シグナル。kill -kill [PID]
14 SIGALRM アラーム。一定時間後にSIGALRMを飛ばせる
15 SIGTERM 終了シグナル。kill -term [PID]

signal キャッチ

C言語で、signalをキャッチするには、signal()関数で、シグナルハンドラーを設定する。

signal(シグナルの種類, 受け取った時に実行する関数)

「signalを受け取った時に実行する関数」のことを、一般的に「signalハンドラー」と呼ぶ。
シグナルハンドラーは、1つのintを引数に、戻り値はvoidでなければならない。

typedef void (*sighandler_t)(int);

signal キャッチ サンプル

HUPをうけとると、無限ループしているプログラムを終了させる。
サーバのような、駐屯型のプログラムはこのようにシグナルで終了する仕組になっている。

#include <signal.h>
#include <stdio.h>

void sigcatch(int);

int main() {
    if (SIG_ERR == signal(SIGHUP, sigcatch)) {
        printf("failed to set signal handler.n");
        exit(1);
    }
	
    while (1) {
        sleep(1);
    }

    return 0;
}
 
void sigcatch(int sig) {
    printf("catch signal %dn", sig); 
    exit(1);
}

シグナルを送る

# ps u
# kill -HUP [プロセス番号]

参考文献

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
ふつうのLinuxプログラミング
プログラミングテクニック―UNIXコマンドのソースコードにみる実践プログラミング手法 (UNIX MAGAZINE COLLECTION)
UNIXコマンドのソースコードにみる実践プログラミング手法
新版 明解C言語 入門編
新版 明解C言語 入門編

Comments are closed.