2012-06-20 9 views
5

Ich verwende Process über ProcessBuilder, um eine in C-Code erstellte ausführbare Datei auszuführen. Ich fange die Process.exitValue(), um auf diese Ausgangswerte zu reagieren. Mir ist aufgefallen, dass nicht alle Exit-Werte von der ausführbaren Datei stammen. Zum Beispiel bekomme ich einen Ausgangswert von 139 und nirgendwo in meinem C-Code gebe ich einen Ausgangswert von 139 zurück.Was bedeuten die Werte von Java Process.exitValue()?

Ich versuche, einen Überblick über die Ausgangswerte zu finden, aber ich kann das nicht finden, und jetzt habe ich gefunden Der Ausgangswert kann vom Betriebssystem abhängig sein. (Ich benutze übrigens Ubuntu).

Es scheint der einzige Ausgangswert zu sein, der 0 ist, wenn alles richtig geht. Gibt es Spezifikationen über Ausgangswerte? Kann ich sicher sein, dass ein bestimmter Bereich nur für mein eigenes Programm verwendet werden kann? Welche Exit-Codes sind für das Betriebssystem reserviert?

Ich fand heraus, dass 139 ist wahrscheinlich ein Speicherfehler im C-Code. Ich möchte das wahrscheinlich loswerden. Ich kann keine Übersicht über Exit-Wert erhalten (zB 139 = .....)

Dies ist der vereinfachte Code durch die Art und Weise ist:

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

Hinweis: Das Ausführen der C ausführbare Datei in dem Ubuntu-Shell gibt überhaupt keinen Fehler (dh Ausgangswert 0). Aber in Java den gleichen Befehl zu tun gibt Exit-Wert 139.

+2

139 ist ein _Segmentierungsfehler_. Das heißt, Ihre _c-app_ greift auf Speicher zu, auf den sie nicht zugreifen sollte. – npe

+0

[This] (http://stackoverflow.com/a/4842719/828625) beantwortet Ihre Frage, glaube ich. –

+1

Gefunden [dies] (http://tldp.org/LDP/abs/html/exitcodes.html) auch, aber ich weiß nicht, wie wichtig es für Sie ist. –

Antwort

4

Wenn das System Ihre Anwendung tötet (wie im Fall von Segmentation fault) setzt er den Exit-Code 128 + SIGNAL - siehe Linux signal(7) manpage für Signalwerte .

Auch für Linux gibt es mehrere Standard-Exit-Codes in sysexits.h Header-Datei definiert, und es wird empfohlen, dass Programmierer diese Konstanten verwenden, anstatt eigene Werte manuell zu definieren. Von exit(3) manpage:

BSD hat versucht, Exit-Codes zu standardisieren; siehe die Datei <sysexits.h>.

Sie können die Datei zum Beispiel finden here, und die darin enthaltenen Werte sind:

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

jedoch mit ihnen nicht zwingend vorgeschrieben ist, und Sie sind frei, jeden Wert, den Sie verwenden möchten.

Die allgemeine Antwort ist - wenn Ihre Anwendung ordnungsgemäß fehlschlägt (d. H. Es ist in der Lage, den Fehler eine Ausführung zu beenden), dann legt es den Exit-Code selbst fest. Wenn die Anwendung vom System beendet wird, legt das System den Beendigungscode fest.

Sie können auch für weitere Informationen this thread sehen.