signal

シグナル (signal) をキャッチします.

#include <signal.h>
void (*signal(
    int sig, /* シグナル番号 */
    void (*func) (int) /* シグナルハンドラ */
)) (int);

signal 関数は, 引数 sig で指定されたシグナル番号に応じて, 引数 func で指定されたシグナルハンドラ (signal handler) を実行します.

abort 関数または, raise 関数で呼び出されるシグナルハンドラ内でraise 関数を呼び出してはいけません.

注意!
POSIX 準拠のシステムでは, signal 関数の代わりに sigaction 関数を使用したほうがよいとされています.

引数

※1 シグナル番号

sig に指定するシグナル番号は以下の通りです.

引数意味
SIGABRT異常終了
SIGFPE誤った算術演算
SIGILL不正な関数イメージの検出
SIGINT対話的なアテンションシグナルの受け取り
SIGSEGV記憶域への不正なアクセス
SIGTERMプログラムへ送信された終了要求
上記以外各処理系で定義されているシグナル番号

※2 シグナルハンドラ

func に指定可能なマクロを以下に示します.

引数意味
SIG_DELそのシグナルに対するデフォルトの操作を行う.
SIG_IGNシグナルを無視する.
上記以外ユーザーが独自に定義したシグナルハンドラ.

戻り値

  • 指定された操作が出来る場合: funcの値
  • 上記以外: SIG_ERR

C言語サンプルプログラム

signal 関数と raise 関数を使用したサンプルプログラムを以下に示します.

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

/* functions */
void sig_catch(int sig);

/* main */
int main(void) {
    /* シグナルハンドラの設定 */
    if (SIG_ERR == signal(SIGABRT, sig_catch)) {
        fprintf(stderr, "error.\n");
        return EXIT_FAILURE;
    }

    /* シグナルを送信する */
    raise(SIGABRT);

    return EXIT_SUCCESS;
}

/** シグナルハンドラ */
void sig_catch(int sig) {
    printf("signal: %d\n", sig);
}

実行例

サンプルプログラムの実行結果は以下のようになります.

signal: 22