2012-06-20 168 views
5

ProcessProcessBuilderを使用して、Cコードで実行可能な実行ファイルを実行しています。私はProcess.exitValue()にこの出口値に反応することをキャッチしています。私はすべての終了値が実行可能ファイルからではないことに気づいた。たとえば、終了値139があり、Cコードのどこにも139の終了値が返されていません。Java Process.exitValue()の値の意味は何ですか?

終了値の概要を調べようとしていますが、これを見つけることができませんでした。出口値をOSに依存させることができます。 (私は途中でUbuntuを使用しています)。

すべてが正しく行けば、必ず0の出口値があるようです。 終了値についての仕様はありますか?特定の範囲を自分のプログラムにしか使用できないことを確認できますか?どの終了コードがOS用に予約されていますか。

Cコードで139がおそらくメモリエラーであることがわかりました。おそらく私はそのことを取り除きたい。

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

注:UbuntuのシェルでCの実行可能ファイルを実行している私は、これは仕方によって単純化されたコードである終了値のいずれかの概要(例:139 = .....)

を取得することはできませんエラーを一切出さない(すなわち、終了値0)。システムは、それが128 + SIGNALに終了コードを設定します(セグメンテーションフォールトの場合のように)あなたのアプリケーションを殺す場合でも、Javaで同じコマンドを実行すると、終了値に139

+2

139が_Segmentation fault_です。 _c-app_がアクセスしてはならないメモリにアクセスしていることを意味します。 – npe

+0

[This](http://stackoverflow.com/a/4842719/828625)私は信じるあなたの質問に答えます。 –

+1

[this](http://tldp.org/LDP/abs/html/exitcodes.html)も見つかりましたが、あなたにとってどれだけ重要なのか分かりません。 –

答えて

4

を与える - 信号値用のLinux signal(7) manpageを参照してください。

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

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

あなたは一例here用のファイルを見つけることができ、そして含まれる値は以下のとおりです。

#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 */ 

はしかし、それらを使用することは必須ではありません、そしてあなたが望む任意の値を自由に使用できます。

一般的な答えは、アプリケーションが正常に動作しない場合(エラーを処理して実行を終了できる場合)、終了コードを単独で設定します。アプリケーションがシステムによって強制終了された場合、システムは終了コードを設定します。

さらに詳しい情報はthis threadを参照してください。

関連する問題