シグナル ハンドラーの通知

cobpostsighandler() ルーチンはシグナル ハンドラーへ通知するものです。

ランタイム システムは、すべてのシグナル処理を通知するために cobpostsighandler() ルーチンを使用します。 オペレーティング システムのデフォルトの動作が終了を引き起こすようなすべてのシグナルに、デフォルトのハンドラーが通知されます。 デフォルトのハンドラーは、終了前に COBOL システムを初期化するか、シグナルを無視することを保証します。 デフォルトのハンドラーは、シグナルがオペレーティング システムによって重大なエラーで引き起こされたか、予期しないで発生したと想定しています。 したがって、114 や 115 のようなランタイム システムのメッセージを生成します。

同一のハンドラーが 2 度通知され、cobremovesighandler() ルーチンで削除されないと、ハンドラーは 2 度実行されます (そのハンドラーや実行中のすべてのハンドラーが 0 を返却しない場合)。

2 つのハンドラーが同一の優先度で通知されると、最後に通知された方が最初に実行されます。

いったんハンドラーに通知すると、再通知は必要ありません。 ハンドラーは、シグナルが受信されるたびに呼び出されます (最初のシグナル受信が終了処理を行わない場合)。 1 度だけハンドラーを実行したい場合、シグナル ハンドラー内で cobremovesighandler() ルーチンでハンドラーを削除する必要があります。

シグナル ハンドラーがシグナル処理中は、そのシグナルはブロックされます。 これにより、同一のシグナルが連続して発生したような場合に、シグナル ハンドラーが再帰的に呼び出されるのを防止します。

シグナル ハンドラーは正常に復帰しなければなりません。 すなわち、longjmp() や coblongjmp() のようなシグナル ハンドラー関数を終了させるような他の関数を使用してはなりません。また、次のように戻り値を返すには C 構文を使用しなければなりません。

return(num);

他の関数を使うと、シグナルがブロックされず、そのシグナルの繰り返し処理を防止できません。

ランタイム システムがシグナルを受信すると、最高の優先度でハンドラーを呼び出します。 ハンドラーは適切な処理 (たとえば、後で処理するためにフラグを設定) を行い、復帰しなければなりません。 ハンドラーが 0 でない値を返却すると、ランタイム システムは次の優先度のシグナルのハンドラーを呼び出します。 シグナル ハンドラーが 0 を返却すると、ランタイム システムはこれ以上シグナル ハンドラーを呼び出しません。

ランタイム システムは、優先度 127 でデフォルトのシグナル ハンドラーに通知します。そのため、シグナル ハンドラーを上書きしたり、その前に独自のシグナル ハンドラーを処理するには、優先度 128 でハンドラーに通知します。デフォルトのランタイム システムハンドラーの後で独自のハンドラーを処理したい場合は、126 あるいはそれ以下の優先度を使う必要があります (デフォルトのランタイム システムのハンドラーが終了しない場合)。

ランタイム システムは、シグナル ハンドラーを使用したいろいろな機能を提供します。 これらのハンドラーは、優先度 129 ~ 139 の範囲で通知されます。