NetCOBOL 技術情報:トラブルシューティング
エラー
Solaris, Linux x86, Linux Itanium
NetCOBOL
Q
Uレベルのエラー発生した場合に、完了コードに設定される値について 教えてください。
A
Uレベルのエラーが発生した場合、完了コードに設定される値は「134」です。
完了コードについては、以下のマニュアルを参照してください。
NetCOBOL メッセージ説明書
- 第3章 実行時メッセージ
表3-1 実行時メッセージの重大度コードの意味と完了コードへの影響
補足
現在のCOBOLランタイムシステムは、Uレベルエラーを検出してメッセージ等の
出力を終えた後、abort()関数を発行しています。
abort()関数は、呼び出し元のプロセスにSIGABRTシグナルを送信します。
完了コードは、シグナルを受信した側、つまり、完了コードを参照する側
の仕様に依存します。
例えば、プロセスがシェル(Bシェル系、Cシェル系)から起動されている場合は、
その仕様に依存して完了コードが決まります。
次表に示すように意味が予約されています。
詳細は、各シェルのマニュアルを参照してください。
| 完了コード | 説明 |
|---|---|
| 0 | シェルスクリプトの実行で、成功した |
| 1~125 | スクリプトで使用可能 |
| 126 | コマンドは見つかったが、ファイルを実行できなかった場合 |
| 127 | コマンドが見つからなかった場合 |
| 128以上 | シグナル番号Nを受け取った場合、完了コードは 128+N の値となる |
注1) 完了コードに設定できる最大値は、「255」です。
注2) COBOLでよく発生するシグナルを以下に示します。
- SIGILL シグナル
シグナル番号は 4となりますので、完了コードは、128 + 4 = 132となります。 - SIGABRT シグナル
シグナル番号は 6 になりますので、完了コードは、128 + 6 = 134 となります。 - SIGBUS シグナル
シグナル番号は 10 になりますので、完了コードは、128 + 10 = 138 となります。 - SIGSEGV シグナル
シグナル番号は 11 になりますので、完了コードは、 128 + 11 = 139 となります。
Uレベル以外の場合は、PROGRAM-STATUSの値が完了コードの値となります。
PROGRAM-STATUSに値を設定していなければ、完了コードに0が設定されます。
COBOLプログラム実行時、Eレベルのエラーが発生すると完了コードには12が
設定されます。ただし、PROGRAM-STATUSに12より大きい値を設定していた場合
PROGRAM-STATUSの値が完了コードに設定されます。
【参考】シグナル番号について
Solaris版
<SIGNAL番号の定義>
「/usr/include/sys/signal.h 」を参照すると、シグナル番号の定義は、
「/usr/include/sys/iso/signal_Iso.h 」にあることがわかります。
SIGABRTのシグナル番号の値は 6 です。
#define SIGABRT 6 /* used by abort, replace SIGIOT in the future */
Linux x86版、Linux Itanium版
<SIGNAL番号の定義>
「/usr/include/sys/signal.h 」を参照すると、シグナル番号の定義は、
「/usr/include/bits/signum.h 」にあることがわかります。
SIGABRTのシグナル番号の値は 6 です。
#define SIGABRT 6 /* Abort (ANSI). */
