実行時関数:割り込みシグナルが発生したときに呼び出される関数を登録します。
モジュール:USE DFLIB
形式
result = SIGNALQQ (sig, func)
sig
(入力) INTEGER(2)。割り込みの型。以下の定数値 (\DF98\INCLUDE サブディレクトリの DFLIB.F90 に定義されています)。
SIG$ABORT - 異常終了
SIG$FPE - 浮動小数点エラー
SIG$ILL - 不正な命令
SIG$INT - CTRL+C シグナル
SIG$SEGV - 不正な記録域参照
SIG$TERM - 終了要求
func
(入力) CHARACTER*(*)。割り込み時に実行される関数の名前。
規則と振る舞い
結果の型は INTEGER(4) です。成功した場合,正の整数が返され,そうでない場合,-1 (SIG$ERR) が返されます。
SIGNALQQ は sig で指定した型のシグナルに対してハンドラとして関数 func をインストールします。ハンドラをインストールしなかった場合,基本設定では,割り込みシグナルが発生した時,終了コード 3 でシステムがプログラムを終了します。
引数 func は関数の名前で,EXTERNAL または IMPLICIT 文のどちらかで宣言されなければなりません,または,明示的インタフェースを持っていなければなりません。INTERFACE ブロックで記述された関数は,基本設定では EXTERNAL で,EXTERNAL を宣言する必要はありません。
SIG$FPE 割り込みを除いた割り込みが発生すると,sig 引数 SIG$INT は func に渡され,func が実行されます。
SIG$FPE 割り込みが発生すると,関数 func には 2 つの引数が渡されます。渡される引数は,SIG$FPE と浮動小数点エラー・コード (たとえば,FPE$ZERODIVIDE または FPE$OVERFLOW) です。浮動小数点エラー・コードは,発生した浮動小数点例外の型を示しています。浮動小数点エラー・コードは,接頭辞 FPE$ で始まります。これらは,\DF98\INCLUDE サブディレクトリの DFLIB.F90 に定義されています。浮動小数点例外については,「浮動小数点環境」を参照してください。
func が帰ると,呼び出したプロセスが割り込みシグナルを受け取った点から直ちに実行を再開します。割り込みの型や操作モードに関係なく行われます。
シグナル・ハンドラ・ルーチンは,通常,割り込みが発生した時に非同期に呼び出されるため,実行時操作が完了せず,不明な状態にある時,自分のシグナル・ハンドラ関数で制御を受け取ることが可能になります。そのため,ヒープ・ルーチンやヒープ・ルーチン (たとえば,I/O ルーチン,ALLOCATE,および DEALLOCATE) を使用するルーチンを呼び出してはいけません。
自分のハンドラ・ルーチンをテストするために,RAISEQQ を呼び出すことによって割り込みシグナルを発生することができます。RAISEQQ は,プログラムを SIGNALQQ で設定したシグナル・ハンドラに飛び越させるか,または,SIGNALQQ がシグナル・ハンドラを設定していない場合のシステムの基本動作をプログラムに実行させます。
以下の例は,SIG$ABORT に対するシグナル・ハンドラを示しています。SIG$FPE に対するシグナル・ハンドラの例は,「浮動小数点例外の処理」に示されています。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
例
! このプログラムは SIG$ABORT に対するシグナル・ハンドラを示しています。 USE DFLIB INTERFACE FUNCTION h_abort (signum) !DEC$ATTRIBUTES C :: h_abort INTEGER(4) h_abort INTEGER(2) signum END FUNCTION END INTERFACE INTEGER(2) i2ret INTEGER(4) i4ret i4ret = SIGNALQQ(SIG$ABORT, h_abort) WRITE(*,*) 'Set signal handler. Return = ', i4ret i2ret = RAISEQQ(SIG$ABORT) WRITE(*,*) 'Raised signal. Return = ', i2ret END ! ! シグナル・ハンドラ・ルーチン ! INTEGER(4) FUNCTION h_abort (signum) !DEC$ATTRIBUTES C :: h_abort INTEGER(2) signum WRITE(*,*) 'In signal handler for SIG$ABORT' WRITE(*,*) 'signum = ', signum h_abort = 1 END