signal - シグナルハンドラの設定

【書式】

#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) 安江正樹@東海大学理学部物理学科】