<csignal>ヘッダ †
<csignal>ヘッダは、さまざまなシグナル?を操作するための関数の宣言と、マクロの定義を行う。処理系によっては、SIG_〜で始まる宣言不可能な関数へのポインタが追加されることがある。また、シグナル番号として、SIG〜で始まるマクロが追加されることがある。<csignal>ヘッダで定義される 6 つのシグナル番号は、raise 関数で明示的に生成される場合を除いて、処理系がこれらのシグナルを生成するとは限らない。
マクロ †
SIG_DFL †
シグナルの既定動作
解説
signal 関数の第 2 実引数として指定することで、そのシグナルに対して処理系の既定の処理が行われるように設定する。
形式
void (*SIG_DFL)(int);
SIG_IGN †
シグナルの無視
形式
void (*SIG_IGN)(int);
解説
signal 関数の第 2 実引数として指定することで、そのシグナルを無視するように設定する。
SIG_ERR †
シグナルの設定失敗
形式
void (*SIG_ERR)(int);
解説
signal 関数によるシグナルの設定に失敗した場合に、返却値として使用される。
SIGABRT †
異常終了
解説
異常終了時に生成されるシグナル番号であり、正の整数値に定義される。このシグナルは abort 関数から呼び出される。
SIGFPE †
誤った算術演算
解説
ゼロ除算やオーバーフローの結果として生成されるシグナル番号であり、正の整数値に定義される。
SIGILL †
不正な関数イメージの検出
解説
プロセッサの不正命令を実行しようとした場合などに生成されるシグナル番号であり、正の整数値に定義される。
SIGINT †
対話的なアテンションシグナルの受け取り
解説
割り込みなど、対話的なアテンションシグナルによって生成されるシグナル番号であり、正の整数値に定義される。例えば、Ctrl-C の入力によるプログラムの中断などによって生成されることが多い。
SIGSEGV †
記憶域への不正なアクセス
解説
書き込み禁止領域への書き込みや、アクセス権限のない領域へのアクセスなどによって生成されるシグナル番号であり、正の整数値に定義される。
SIGTERM †
終了要求
解説
プログラムへ送信された終了要求などによって生成されるシグナル番号であり、正の整数値に定義される。
型 †
sig_atomic_t †
不可分なアクセスが可能な型
解説
sig_atomic_t 型は、非同期割り込みが存在する場合でも、不可分にアクセスすることができる、volatile 修飾する可能な整数型である。
関数 †
raise †
シグナルの送信
形式
namespace std {
int raise(int sig);
}
引数
sig: シグナル番号
返却値
raise 関数の呼び出しに成功した場合は 0 を、失敗した場合は 0 以外を返す。
解説
シグナル番号 sig を実行中のプログラムに送信する。sig には、<csignal>ヘッダで定義される SIG〜から始まるマクロ (SIGABRTなど) を指定する。
signal †
シグナルの設定
形式
namespace std {
void (* signal(int sig, void (* func)(int)) )(int);
}
引数
sig: シグナル番号
func: シグナル処理ルーチン
返却値
signal 関数の呼び出しに成功した場合、以前に signal 関数によって設定されていた func の値を返す。設定に失敗した場合は SIG_ERR を返す。
解説
シグナル番号 sig が発生した場合に実行される処理を設定する。signal 関数が SIG_ERR を返した場合、errno の値は不定になる。非同期シグナル処理ルーチン?が生成したシグナルを受けた場合の動作は未定義である。
- func が SIG_DFL であれば、そのシグナルに対する既定の処理が行われる。
- func が SIG_IGN? であれば、そのシグナルは無視される。
- シグナル処理ルーチン?、すなわち関数であれば、そのシグナルが発生したときにシグナル処理ルーチン?が呼び出される。
シグナル処理ルーチン? func から復帰した場合、sig が SIGFPE であるか、処理系定義の計算処理例外であった場合*2の動作は未定義である*3。その他の場合は、プログラムが中断されたところから再開される。
abort 関数 または raise 関数 の結果としてシグナルが発生した場合、シグナル処理ルーチン?では、abort 関数、exit 関数、または longjmp 関数 によって呼び出しを終了することができる。
abort 関数 または raise 関数 の結果として発生したシグナル以外であり、かつ次のいずれかである場合の動作は未定義である。
- シグナル処理ルーチン? func からの、signal 関数を除く標準ライブラリ関数のいずれかの呼び出し*4。
- シグナル処理ルーチン? func からの、任意の静的記憶域期間を持つオブジェクトの参照。ただし、volatile sig_atomic_t 型のオブジェクトへの代入を除く。
プログラムの開始時点で、いくつかのシグナル番号に対して signal(sig, SIG_IGN) が実行される場合がある。それ以外のシグナル番号に対しては signal(sig, SIG_DFL) が実行される。
すべてのライブラリ関数は、signal 関数が呼び出すことがないかのように定義されている。
参照 †
*1 C99 では、signal(sig, SIG_DFL) が呼び出されるか、シグナル処理ルーチン?が終了するまで、同種のシグナルの発生を遮るかは処理系定義
*2 C99 では、SIGILL または SIGSEGV の場合も同様
*3 規格上、SIGFPE 等の計算処理例外シグナルが発生した場合、シグナル処理ルーチン?から復帰する方法がない
*4 C99 では、abort 関数 または _Exit 関数も呼び出すことができる。また、signal 関数の呼び出しは、同種のシグナルに対して行わなければならない。
Last-modified: Wed, 07 Dec 2005 16:47:29 JST (4823d)