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

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.