このヘッダの目的
<signal.h>は、シグナル処理をする助けになる。
定義済み識別子
この他に、"SIG"で始まり4文字目が英大文字か、"SIG_"で始まり5文字目が英大文字である識別子は定義されている可能性がある。
働き
シグナルとは、通常の実行の流れを中断して、他の処理を実行するのに使われる、プログラムに対する信号である。 普通シグナルは異常事態に発生し、プログラムを終了するが、その他の使い方をすることもできる。
シグナルの種類はシグナルハンドラと呼ばれる正の整数で表され、SIGではじまる識別子はシグナルハンドラの一つを表すマクロである。
シグナルが発生すると、そのシグナルハンドラに応じた関数が呼ばれる。 この種類と関数の対応はプログラマがsignal()を使うことでカスタマイズできる。
シグナルは実行中にエラーが起きたときに発生するが、raise()を使って明示的に発生させることもできる。
sig_atomic_t型は、「非同期割り込みの際にも参照可能な不可分実体」というふうに規格で定義されているが、 普段は使う必要はない。
SIG_DFL、SIG_ERR、SIG_IGNは、signal()の第二引数に渡せる型に展開されるマクロである。
つまり、void (*)(int)
関数のポインタ型である。これらは宣言可能などんな関数とも違うアドレスを指している。
以下のマクロは対応するシグナルハンドラに展開される。
SIGABRT
abort()に引き起こされるような異常な中断。
SIGFPE
数値演算におけるエラー。例えばゼロ除算やオーバーフローを起こす演算など。
SIGILL
正しくない関数イメージの検出。例えば知られていないインストラクションなど。
SIGINT
外部からの干渉に使われるシグナル。
SIGSEGV
不正な記憶域への参照。
SIGTERM
プログラムへの終了要求。