【C言語】signal.hを使って出来ることと典型的な使い方【標準ライブラリ】

【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;
}

クリーンアップ処理

プログラム終了前に後処理を行う場合、SIGTERMSIGINT を捕捉し、リソースを解放できます。

#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) {}
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です