【書式】
#include <signal.h>
void (*signal(int sig, void (*handler)()))();
【解説】
signal()はシグナルが発生したときにそれを処理するハンドラ関数 handler
をインストールします。
handler() はハンドラ関数へのポインタです。シグナルが発生したときにハ
ンドラ関数がコールされます。handlerをSIG_DFLとしたときには、そのシグ
ナルが発生したときにプログラム実行は中断されます。SIG_IGN のときには
そのシグナルは無視され、プログラムの実行は継続されます。
シグナルの種類sigには次のものがあります。
SIGABRT
異常終了
SIGFPE
算術エラー
SIGILL
不当命令
SIGINT
インタラプト(Ctrl-C)
SIGSEGV
メモリアクセス違反
SIGTERM
終了要求
ハンドラとなる関数は
void handler(int sig [ , int subcode ] );
という形で定義します。sigは上記のうちの1つです。subcodeはsigがSIGFPE
のときに渡されます。subcodeには次の種類があります。
FPE_INTDIV0
整数の0除算をしました
FPE_INVALID
不正な演算を実行しました
FPE_DENORMAL
デノーマル数を生成しました(結果の値が小さすぎます)
FPE_ZERODIVIDE
浮動小数点の0除算をしました
FPE_OVERFLOW
オーバーフローしました
FPE_UNDERFLOW
アンダーフローしました
FPE_INEXACT
正確に表現できないので近似しました
FPE_EXPLICITGEN
raise(3)によってハンドラが起動されました
シグナルが発生すると、 ハンドラがコールされる前にsignalはSIG_DFLにリ
ストアされます。その後でハンドラが
(*handler)(sig [ , subcode ] );
という形でコールされます。シグナル処理が終了すると、シグナルを検出し
たところからプログラムの実行が再開されます。
【リターン値】
signal()は以前に設定されていた handler を返します。 エラーのときには
errnoをセットし、SIG_ERRを返します。
【エラー】
EINVAL
パラメタの値が不正です
【可搬性】
ANSI, UNIX, DOS窓
【参照】
raise(3), abort(3), matherr(3M)
【バグ】
本ライブラリでは6種類のシグナルのうち、SIGILL, SIGSEGV, SIGTERMはサ
ポートしていません。それらはraise(3)を使うことによって、ソフトウェア
シグナルとして利用できます。
【copyright (c) 安江正樹@東海大学理学部物理学科】