SIGNAL

可搬用関数:割り込みシグナル処理を制御します。指定したシグナルに対する動作を変更します。

モジュール:USE DFPORT

形式

result = SIGNAL (signum, proc, flag)

signum
(入力) INTEGER(4)。変更したいシグナルの番号。番号とシンボル名は,以下の表に一覧表示されています。

proc
(入力) CHARACTER*(*)。外部シグナル処理ルーチンの名前。flag が負の場合のみ,この関数が呼び出されます。

flag
(入力) INTEGER(4)。負の場合,ユーザーの proc ルーチンが呼び出されます。0 の場合,シグナルは基本動作を保ちます。1 の場合,シグナルは無視されます。

結果

結果の型は INTEGER(4) です。結果は,指定したシグナルに関連した proc の以前の値です。たとえば,proc の以前の値が SIG_IGN だった場合,返し値も SIG_IGN です。提供したシグナル番号が不正である場合,flag 値が 1 より大きい場合や,以前の動作定義に戻したい場合に,この戻し値を 次の SIGNAL の呼び出しに使うことができます。

SIG_ERR の返し値はエラーを示しています。この場合,IERRNO の呼び出しは EINVAL を返します。提供したシグナル番号が不正である場合や,flag 値が 1 よりも大きい場合,SIGNAL は -(EINVAL) を返し,IERRNO の呼び出しは EINVAL を返します。

初期シグナル・ハンドラは,SIGFPE (シグナル 8) の起動時に設定されます。SIGFPE に対して最初に SIGNAL が呼び出されたときに,そのアドレスが返されます。他のシグナルは,初期シグナル・ハンドラを持っていません。

SIGNALQQ または C シグナル関数を使ってハンドラを設定し,可搬用 SIGNAL 関数をその値を取り出すために使用するように注意してください。SIGNAL が SIGNAL の呼び出して以前設定しなかったアドレスを返した場合,SIGNALQQ または C シグナル関数でそのアドレスを使用することができませんが,直接それを呼び出すことは可能です。しかしながら,次の SIGNAL の呼び出しに SIGNAL からの返し値を使うことができます。これにより,元のシグナル・ハンドラがどのように設定されたかに関係なく,シグナル・ハンドラを戻すことができます。

すべてのシグナル・ハンドラは実際に受信されたシグナル番号の 1 つの整数引数で呼び出されます。一般に,プロセスがシグナルを受信すると,それは終了します。SIGNAL 関数を使えば,この代わりにユーザー手続が呼び出されます。シグナル・ハンドラ・ルーチンは,シグナル番号整数引数を使わなくても,シグナル番号整数引数を受け取らなければなりません。ルーチンがシグナル番号整数引数を受け取らない場合,シグナル・ハンドラが実行された後,スタックが正しく復元されません。

シグナル・ハンドラ・ルーチンは,一般に,割り込みが発生した時に非同期に呼び出されるため,自分のシグナル・ハンドラ関数が実行時操作が不完全に終了した時や不明な状態で終了した時に制御を得ることが可能になります。自分のシグナル・ハンドラ・ルーチンに使用することができる関数に特定の制限があります。

SIGKILL を捕まえることも無視することもできません。

以下の表は,シグナル,その名前と値を一覧表示しています。

シンボル名 番号 説明
SIGABRT 6 異常な終了
SIGFPE 8 浮動小数点エラー
SIGKILL 9 プロセスのキル
SIGILL 4 不正な命令
SIGINT 2 CTRL+C シグナル
SIGSEGV 11 不正な記憶域参照
SIGTERM 15 終了要求

すべてのシグナルに対する基本動作は,終了コードをつけてプログラムを終了させることです。

ABORT は SIGABRT シグナルを表明しません。SIGABRT または SIGTERM を表明するための唯一の方法は,KILL を使うことです。

SIGNAL は SIGFPE 例外を捕まえるために使用することができますが,SIGFPE を生じたエラー・コードを参照するためには使用できません。これを行うには,代わりに SIGNALQQ を使用します。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

SIGNALQQ

例

	USE dfport
	EXTERNAL h_abort
	INTEGER(4) iret1, iret2, procnum
	iret1 = SIGNAL(SIGABRT, h_abort, -1)
	WRITE(*,*) 'Set signal handler. Return = ', iret1

	iret2 = KILL(procnum, SIGABRT)
	WRITE(*,*) 'Raised signal. Return = ', iret2
	END
	!
	! シグナル・ハンドラ・ルーチン
	!
	INTEGER(4) FUNCTION h_abort (sig_num)
	INTEGER(4) sig_num

	WRITE(*,*) 'In signal handler for SIG$ABORT'
	WRITE(*,*) 'signum = ', sig_num
	h_abort = 1
	END