シグナルハンドラの通知

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

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

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

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

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

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

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

return(num);

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

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

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

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