SIGNALQQ

実行時関数:割り込みシグナルが発生したときに呼び出される関数を登録します。

モジュールUSE DFLIB

形式

result = SIGNALQQ (sig, func)

sig
(入力) INTEGER(2)。割り込みの型。以下の定数値 (\DF98\INCLUDE サブディレクトリの DFLIB.F90 に定義されています)。

func
(入力) CHARACTER*(*)。割り込み時に実行される関数の名前。

規則と振る舞い

結果の型は INTEGER(4) です。成功した場合,正の整数が返され,そうでない場合,-1 (SIG$ERR) が返されます。

SIGNALQQsig で指定した型のシグナルに対してハンドラとして関数 func をインストールします。ハンドラをインストールしなかった場合,基本設定では,割り込みシグナルが発生した時,終了コード 3 でシステムがプログラムを終了します。

引数 func は関数の名前で,EXTERNAL または IMPLICIT 文のどちらかで宣言されなければなりません,または,明示的インタフェースを持っていなければなりません。INTERFACE ブロックで記述された関数は,基本設定では EXTERNAL で,EXTERNAL を宣言する必要はありません。


注意:すべてのシグナル・ハンドラ関数は,cDEC$ ATTRIBUTES C オプションで宣言されなければなりません。

SIG$FPE 割り込みを除いた割り込みが発生すると,sig 引数 SIG$INTfunc に渡され,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

関連情報

KILLRAISEQQSIGNAL

	! このプログラムは 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