COBOL2002 使用の手引 手引編


36.9 シグナル

〈この節の構成〉

(1) COBOLが登録するシグナル

シグナルとは,ハードウェア,およびソフトウェアで発生する割り込みのことです。COBOLでは,-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeオプションのどれかを指定してコンパイルしたプログラムを実行する場合,次に示すシグナルを登録します。

なお,マルチスレッド対応COBOLプログラムでは,さらに次の二つが追加されます。これらは,システムのシグナルではなく,異常終了時要約情報リストに表示されるシグナル種別です。

COBOL以外のプログラムで上記シグナルを登録した場合,異常終了時の結果を保証できない場合があります。詳細は,「19.1 C言語との連携」を参照してください。

上記シグナルが発生した原因として,代表的なものを次に示します。

また,-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeオプションのどれかを指定してコンパイルされたCOBOLプログラムに,一度以上制御が渡り,上記のシグナル発生によって異常終了した場合,COBOLの戻り値は1になります。

割り込み発生条件が,COBOLによって変更されることはありません。

(2) シグナルの登録と回復

-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeオプションと-MultiThreadオプション(マルチスレッド対応COBOLプログラム)指定によるシグナルの登録と,COBOLプログラム終了時のシグナルの回復について,次に示します。

コンパイラオプション

COBOLのシグナル登録/回復

-DebugInf

-DebugInf,Trace

-DebugCompati

-DebugData

-TDInf

-CVInf

-DebugRange

-MultiThread

シグナル登録

シグナル回復

あり

あり

登録あり

シグナルは,すべてのスレッドで有効

回復なし

なし※2

登録あり

回復あり

なし※1

登録なし

あり/なしが混在

あり

登録あり

シグナルは,すべてのスレッドで有効

回復なし

なし※2

登録あり※3

回復あり※3

(凡例)

−:該当しない

注※1

-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeオプションを指定しないプログラムだけが動作した場合です。

注※2

-MultiThreadオプションを指定しないマルチスレッド非対応のCOBOLプログラムだけが動作した場合です。

注※3

-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeオプション指定プログラムが初めて動作したときにCOBOLがシグナルを登録し,COBOLプログラム終了時シグナルが回復します。

(3) シグナルの登録と回復の注意事項

(a) COBOLがシグナルを登録する場合

  • プログラム実行中にシグナルが発生したとき,COBOLは異常終了を通知するCOBOLのメッセージ,および異常終了時要約情報リストを出力して,マルチスレッド対応COBOLプログラム動作時はスレッドを終了します。マルチスレッド対応COBOLプログラム以外ではプロセスを終了します。

  • COBOLプログラム以外でシグナルを登録し,その後,COBOLが同じシグナルを登録するとき,COBOLがシグナルを回復しないかぎり,先に登録していたシグナルのアクションには従いません。

(b) COBOLがシグナルを登録しない場合

  • プログラム実行中にシグナルが発生しても,異常終了を通知するCOBOLのメッセージ,および異常終了時要約情報リストは出力されません。プログラムの終了方法はシステムに依存します。

  • COBOLプログラム以外でシグナルを登録している場合は,登録時のアクションに従います。

(c) COBOLがシグナルを回復する場合

  • COBOLプログラムの終了時,COBOLは登録したシグナルをCOBOLプログラム実行前の状態に回復します。

  • CBLENDサービスルーチン呼び出し後,シグナルはCOBOLプログラム実行前の状態に回復しています。サービスルーチンの詳細は,「29 サービスルーチン」を参照してください。

(d) COBOLがシグナルを回復しない場合

  • COBOLプログラムの終了,またはCBLENDサービスルーチン呼び出し後,COBOLはシグナルを回復しません。

  • COBOLプログラム以外でシグナルを登録し,その後,COBOLが同じシグナルを登録するとき,先に登録していたシグナルの動作には従いません。

(e) マルチスレッド対応COBOLプログラムの場合

  • 登録したシグナルは,すべてのスレッドで有効となります。

  • COBOLプログラムの終了時,COBOLは登録したシグナルを回復しません。このため,CBLENDサービスルーチン呼び出し後でも,シグナルはCOBOLが登録した状態です。

  • シグナルの動作は,プロセス内のすべてのスレッドに影響があります。

    このため,次の順でシグナルが発生した場合,COBOLはシグナルをとらえ,異常終了を通知するCOBOLのメッセージを出力してシグナルが発生したスレッドを終了します。

    1. スレッドで,-DebugInfオプション指定のプログラムを実行した。

    2. 1.以降,-DebugInfオプション指定のプログラムが動作していない別スレッドでシグナルが発生した。

(f) COBOL以外のプログラムでのシグナル登録(ユーザの設定)

  • COBOLプログラムの呼び出し終了後,シグナル発生時の動作を規定する必要があるときは,COBOL以外のプログラムでシグナルの再登録を行ってください。

  • -DebugInfオプションを指定したプログラムが実行されたときにCOBOLが登録するシグナルが,COBOL以外のプログラムで登録するシグナルに影響があるときは,プログラムの制御を変更するか,または-DebugInfオプションを指定しなければ回避できます。

(4) プロセスの終了

異常終了時要約情報リストを出力後,プロセスは終了コード1で終了します。

(5) プログラム実行時にシグナル登録しない環境変数CBLEXCEPT

この環境変数にNOSIGNALを指定すると,デバッグ用コンパイラオプション-DebugInf, -DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRange のどれかを指定したプログラムの実行中にシグナル登録をしません。

このため,異常終了要因となるシグナルが発生しても,デバッグ情報は出力しません。終了方法は,制御プログラムの終了処理に依存します。

制御プログラムの終了処理を次に示します。