富士通

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). */