5

私はProcessviaProcessBuilderを使用してCコードで作成された実行可能ファイルを実行しています。私はProcess.exitValue()この出口値に反応するためにを捕まえています。すべての終了値が実行可能ファイルからのものではないことに気づきました。たとえば、139の終了値を取得しましたが、Cコードのどこにも139の終了値を返していません。

出口値の概要を見つけようとしていますが、これが見つかりません。出口値がOSに依存する可能性があることがわかりました。(ちなみに私はUbuntuを使用しています)。

すべてが順調に進んだときに確認できる唯一の終了値は0のようです。出口値に関する仕様はありますか?特定の範囲が自分のプログラムにのみ使用できることを確認できますか?OS用に予約されている終了コード。

139はおそらくCコードのメモリエラーであることがわかりました。たぶん取り除きたいです。終了値の概要を取得できません(例:139 = .....)

ちなみに、これは簡略化されたコードです。

ProcessBuilder p = new ProcessBuilder(executableName,
   executableArguments);
final Process shell = p.start();
InputStream shellIn = shell.getInputStream();
int shellExitStatus = shell.exitValue();

注:UbuntuシェルでC実行可能ファイルを実行しても、エラーはまったく発生しません(つまり、終了値0)。ただし、Javaで同じコマンドを実行すると、終了値139が得られます。

4

1 に答える 1

4

システムがアプリケーションを強制終了すると(セグメンテーション違反の場合のように)、終了コードが128 + SIGNALに設定されます。シグナル値については、Linuxのsignal(7)マンページを参照してください。

また、Linuxの場合、ヘッダーファイルで定義されているデフォルトの終了コードがいくつかありますsysexits.h。プログラマーは、独自の値を手動で定義するのではなく、これらの定数を使用することをお勧めします。exit(3)マンページから:

BSDは、終了コードの標準化を試みました。ファイルを参照してください<sysexits.h>

たとえば、ここでファイルを見つけることができ、含まれる値は次のとおりです。

#define EX_OK           0  /* successful termination */

#define EX__BASE        64  /* base value for error messages */

#define EX_USAGE        64  /* command line usage error */
#define EX_DATAERR      65  /* data format error */
#define EX_NOINPUT      66  /* cannot open input */
#define EX_NOUSER       67  /* addressee unknown */
#define EX_NOHOST       68  /* host name unknown */
#define EX_UNAVAILABLE  69  /* service unavailable */
#define EX_SOFTWARE     70  /* internal software error */
#define EX_OSERR        71  /* system error (e.g., can't fork) */
#define EX_OSFILE       72  /* critical OS file missing */
#define EX_CANTCREAT    73  /* can't create (user) output file */
#define EX_IOERR        74  /* input/output error */
#define EX_TEMPFAIL     75  /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76  /* remote error in protocol */
#define EX_NOPERM       77  /* permission denied */
#define EX_CONFIG       78  /* configuration error */

#define EX__MAX         78  /* maximum listed value */

ただし、それらの使用は必須ではなく、任意の値を自由に使用できます。

一般的な答えは、アプリケーションが正常に失敗した場合(つまり、実行の終了時にエラーを処理できる場合)、それ自体で終了コードを設定します。アプリケーションがシステムによって強制終了された場合、終了コードを設定するのはシステムです。

追加情報については、このスレッドを参照することもできます。

于 2012-06-20T13:23:08.130 に答える