2012-06-20 12 views
5

Używam Process przez do uruchamiania pliku wykonywalnego wykonanego w kodzie C. Łapię Process.exitValue(), aby zareagować na te wartości wyjścia. Zauważyłem, że nie wszystkie wartości wyjściowe pochodzą z pliku wykonywalnego. Na przykład, otrzymuję wartość końcową 139 i nigdzie w moim kodzie C zwracam wartość końcową 139.Jakie jest znaczenie wartości z Java Process.exitValue()?

Próbuję znaleźć przegląd wartości wyjściowych, ale nie mogę tego znaleźć, a teraz znalazłem out wartość wyjścia może być zależna od systemu operacyjnego. (Używam Ubuntu nawiasem mówiąc).

Wygląda na to, że jedyną wartością wyjściową, o której mowa, jest 0, gdy wszystko idzie w prawo. Czy istnieją specyfikacje dotyczące wartości wyjściowych? Czy mogę mieć pewność, że pewien zakres może być użyty tylko dla mojego własnego programu? Jakie kody wyjścia są zarezerwowane dla systemu operacyjnego.

Okazało się, że 139 jest prawdopodobnie błędem pamięci w kodzie C. Chcę się tego pozbyć. Nie mogę uzyskać żadnych przegląd wartości wyjściowych (np 139 = .....)

To jest uproszczony kod przy okazji:

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

Uwaga: Uruchomienie pliku wykonywalnego C w powłoce Ubuntu nie daje żadnego błędu (tj. wartość wyjścia 0). Ale robi to samo polecenie w Javie daje wartość Exit 139.

+2

139 jest błędem _Segmentation_. Oznacza to, że twój _c-app_ ma dostęp do pamięci, do której nie powinien mieć dostępu. – npe

+0

[This] (http://stackoverflow.com/a/4842719/828625) odpowiada na twoje pytanie, które wierzę. –

+1

Znalezione [to] (http://tldp.org/LDP/abs/html/exitcodes.html) również, ale nie wiem, jak ważne jest to dla ciebie. –

Odpowiedz

4

Jeśli system zabija swoją aplikację (jak w przypadku segmentacji winy) ustawia kod wyjścia do 128 + SIGNAL - patrz linux signal(7) manpage dla wartości sygnału .

Ponadto, w systemie Linux istnieje kilka domyślnych kodów wyjściowych zdefiniowanych w pliku nagłówkowym sysexits.h. Zaleca się, aby programiści korzystali z tych stałych zamiast ręcznego definiowania własnych wartości. Od exit(3) manpage:

BSD próbowało ujednolicić kody wyjścia; zobacz plik <sysexits.h>.

Można znaleźć plik na przykład here i wartości zawarte są:

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

Jednak używanie ich nie jest obowiązkowe, i jesteś wolny, aby używać żadnych wartości chcesz.

Ogólna odpowiedź brzmi: jeśli aplikacja nie powiedzie się z wdziękiem (tj. Jest w stanie obsłużyć błąd i zakończyła wykonywanie), to ustawia kod wyjścia samodzielnie. Jeśli aplikacja zostanie zabita przez system, to system ustawia kod wyjścia.

Możesz również zobaczyć this thread, aby uzyskać dodatkowe informacje.