SIGNAL(2)

名前
signal - ANSI C シグナル操作

書式
#include <signal.h>

void (*signal(int signum, void (*handler)(int)))(int);

説明
signal システム・コールは signum で指定された番号のシグナルに 新しいシグナル・ハンドラー(signal hanlder)を設定する。 このシグナル・ハンドラーは handler に設定され、ユーザーの指定した関数または以下のどれかである:

    SIG_IGN
        そのシグナルを無視(ignore)する。

    SIG_DFL
        そのシグナルをデフォルトの動作に戻す。

シグナル・ハンドラー・ルーチンへと渡される整数(int)引き数は シグナル番号である。これは一つのシグナル・ハンドラーを複数の シグナルのために使用することを可能にする。

返り値
signal は今までのシグナル・ハンドラーの値を返すか、エラーの場合は SIG_ERR を返す。

注意
SIGKILL や SIGSTOP にシグナル・ハンドラーを設定することはできない。

BSD システムと異り、Linux のシグナルは発生するごとに デフォルトの動作に戻される。 一方で、もし <signal.h> のかわりに <bsd/signal.h> をインクルードしたならば、 signal は __bsd_signal が再定義されて BSD 方式(semantics)となる。どちらの種類の signal も sigaction(2) を用いて作られたライブラリ・ルーチンである。

もし、このマニュアルの先頭の型宣言(prototype)に混乱したならば、 以下のように分離するいいかもしれない:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

POSIX によると、kill() や raise() 関数で生成できない SIGFPE, SIGILL, SIGSEGV シグナルを無視(ignore)した後の動作は未定義で ある。ゼロによる整数割り算の結果は未定義となる。 ある種のアーキテクチャー(architecture)ではこれは SIGFPE シグナルを生成する。 (同様に負の最大整数を -1 で割ると SIGFPE が生成されるかもしれない。) このシグナルを無視すると無限ループに落ちいるかもしれない。

POSIX (B.3.3.1.3) によると SIGCHLD の動作として SIG_IGN を設定してはならない。 BSD と SYSV の動作は異っている。SIGCHLD の動作に SIG_IGN を設定している BSD のソフトウェアは Linux では失敗する。

準拠
ANSI C

関連項目
kill(1), kill(2), killpg(2), pause(2), raise(3), sigaction(2), signal(7), sigsetops(3), sigvec(2), alarm(2).