【C言語】signal.hを使って出来ることと典型的な使い方【標準ライブラリ】
signal.hとは
signal.h
は、C言語でシグナルを扱うための標準ライブラリです。
シグナルとは、オペレーティングシステムがプロセスに対して送る通知であり、特定のイベントを知らせるために使用されます。
例えば、Ctrl+C
を押すと SIGINT
(割り込み)が送られます。
kill
コマンドを使うと、特定のシグナルをプロセスに送ることができます。
代表的なシグナル
シグナルにはさまざまな種類があります。代表的なものを以下に示します。
シグナル名 | 番号 | 意味 |
---|---|---|
SIGINT | 2 | 割り込み (Ctrl+C) |
SIGTERM | 15 | プロセス終了要求 |
SIGKILL | 9 | 強制終了(無視不可) |
SIGALRM | 14 | アラームシグナル |
シグナルハンドラの登録
シグナルを捕捉するには、signal()
関数を使います。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handler(int signum) {
printf("シグナル %d を受信\n", signum);
}
int main() {
signal(SIGINT, handler);
while (1) {
printf("実行中...\n");
sleep(1);
}
return 0;
}
シグナルを無視する
SIGINT
を無視するには、ハンドラに SIG_IGN
を設定します。
signal(SIGINT, SIG_IGN);
デフォルトのシグナル処理に戻す
デフォルトの処理に戻すには SIG_DFL
を使います。
signal(SIGINT, SIG_DFL);
シグナルを送る
プログラム内で kill
を使って別のプロセスにシグナルを送れます。
#include <signal.h>
#include <unistd.h>
kill(12345, SIGTERM); // PID 12345 に SIGTERM を送る
タイマーシグナル(alarm関数)
alarm()
を使うと一定時間後に SIGALRM
を発生させられます。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler(int signum) {
printf("タイマー発動!\n");
}
int main() {
signal(SIGALRM, alarm_handler);
alarm(3);
pause();
return 0;
}
クリーンアップ処理
プログラム終了前に後処理を行う場合、SIGTERM
や SIGINT
を捕捉し、リソースを解放できます。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void cleanup(int signum) {
printf("プログラム終了処理...\n");
exit(0);
}
int main() {
signal(SIGTERM, cleanup);
signal(SIGINT, cleanup);
while (1) {}
}
応用例
シグナルを活用した実用的な例を紹介します。
1. Ctrl+C を押しても停止しないカウンタ
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void ignore_signal(int signum) {
printf("SIGINT を無視しました\n");
}
int main() {
signal(SIGINT, ignore_signal);
for (int i = 0; ; i++) {
printf("カウント: %d\n", i);
sleep(1);
}
}
2. 指定時間後に自動終了するプログラム
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
void exit_after_alarm(int signum) {
printf("時間切れ、終了します\n");
exit(0);
}
int main() {
signal(SIGALRM, exit_after_alarm);
alarm(10);
while (1) {}
}