シグナルとは
いわゆる「割り込み」の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 [プロセス番号]
# kill -HUP [プロセス番号]
参考文献
![]() ふつうのLinuxプログラミング |
![]() UNIXコマンドのソースコードにみる実践プログラミング手法 |
![]() 新版 明解C言語 入門編 |




[...] イイ!! プログラミング Blog プログラミングやLinuxについてのメモです。 « [C言語]シグナルをキャッチする サンプルコード [...]