36.9 シグナル
- 〈この節の構成〉
(1) COBOLが登録するシグナル
シグナルとは,ハードウェア,およびソフトウェアで発生する割り込みのことです。COBOLでは,-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeオプションのどれかを指定してコンパイルしたプログラムを実行する場合,次に示すシグナルを登録します。
-
SIGILL(無効な命令)
-
SIGIOT(abortによる異常終了)
-
SIGEMT(EMT命令)(AIXで有効)
-
SIGFPE(浮動小数点例外,算術演算エラー)
-
SIGBUS(バスエラー)
-
SIGSEGV(セグメンテーション違反)
なお,マルチスレッド対応COBOLプログラムでは,さらに次の二つが追加されます。これらは,システムのシグナルではなく,異常終了時要約情報リストに表示されるシグナル種別です。
-
RUNTIME ERROR(実行時エラーの発生)
-
CBLABN(CBLABNサービスルーチンの呼び出し)
COBOL以外のプログラムで上記シグナルを登録した場合,異常終了時の結果を保証できない場合があります。詳細は,「19.1 C言語との連携」を参照してください。
上記シグナルが発生した原因として,代表的なものを次に示します。
-
添字,または指標の値がOCCURS句で定義した範囲を超えた場合
-
部分参照で一意名の範囲を超えて参照した場合
-
呼び出すプログラムと呼び出されるプログラムとで引数の属性,長さ,数が不一致である場合
-
COBOL実行時エラーの発生,CBLABNサービスルーチンの呼び出し,またはCOBOLプログラム以外abortシステムコールを発行した場合
また,-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 |
(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のメッセージを出力してシグナルが発生したスレッドを終了します。
-
スレッドで,-DebugInfオプション指定のプログラムを実行した。
-
1.以降,-DebugInfオプション指定のプログラムが動作していない別スレッドでシグナルが発生した。
-
(f) COBOL以外のプログラムでのシグナル登録(ユーザの設定)
-
COBOLプログラムの呼び出し終了後,シグナル発生時の動作を規定する必要があるときは,COBOL以外のプログラムでシグナルの再登録を行ってください。
-
-DebugInfオプションを指定したプログラムが実行されたときにCOBOLが登録するシグナルが,COBOL以外のプログラムで登録するシグナルに影響があるときは,プログラムの制御を変更するか,または-DebugInfオプションを指定しなければ回避できます。
(4) プロセスの終了
異常終了時要約情報リストを出力後,プロセスは終了コード1で終了します。
(5) プログラム実行時にシグナル登録しない環境変数CBLEXCEPT
この環境変数にNOSIGNALを指定すると,デバッグ用コンパイラオプション-DebugInf, -DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRange のどれかを指定したプログラムの実行中にシグナル登録をしません。
このため,異常終了要因となるシグナルが発生しても,デバッグ情報は出力しません。終了方法は,制御プログラムの終了処理に依存します。
制御プログラムの終了処理を次に示します。
-
NOSIGNALを指定した場合,セグメンテーション違反など,シグナルの発生により異常終了したとき,メッセージ,および異常終了時要約情報リストなどは出力されません。このとき,coreファイルが出力されます※ので,coreファイル,実行可能ファイルからシステムデバッガ(xdbやdbxなど)のトレース情報を採取してください。
また,ユーザプログラムで例外処理(シグナル登録)があれば,ユーザプログラムに制御が移ります。
なお,ミドルソフトウェアなどで,この例外処理を実装している場合もありますので,異常終了時の出力情報を確認してください。
-
NOSIGNALの指定をしても,COBOL実行時エラーメッセージを出力して異常終了する場合は,従来と同じ動作となり,デバッグ用コンパイラオプションを指定したプログラムでは,メッセージ,および異常終了時要約情報リストが出力されます。
-
この環境変数を指定しない場合は,従来と同様に,COBOLがシグナルを登録し,シグナル発生時はデバッグ情報を出力する動作となります。
-
この環境変数を指定しても実行性能への影響はありません。
- 注※
-
システムのcoreファイルサイズの設定値が0になっている場合,coreファイルが出力されません。システムのマニュアルなどで必要な設定値をご確認ください。