2012-06-20 17 views
5

Sto usando Process tramite ProcessBuilder per eseguire un eseguibile fatto in codice C. Sto prendendo il Process.exitValue() per reagire a questi valori di uscita. Ho notato che non tutti i valori di uscita provengono dall'eseguibile. Ad esempio, ottengo un valore di uscita di 139 e da nessuna parte nel mio codice C restituisco un valore di uscita di 139.Qual è il significato dei valori da Java Process.exitValue()?

Sto cercando di trovare una panoramica dei valori di uscita, ma non riesco a trovarlo, e ora ho trovato il valore di uscita può essere dipendente dal sistema operativo. (Sto usando Ubuntu tra l'altro).

Sembra che l'unico valore di uscita di cui essere sicuro sia 0 quando tutto va bene. Ci sono delle specifiche sui valori di uscita? Posso essere sicuro che un determinato intervallo possa essere utilizzato solo per il mio programma? Quali codici di uscita sono riservati per il sistema operativo.

Ho scoperto che 139 è probabilmente un errore di memoria nel codice C. Voglio sbarazzarmi del probabilmente. Non può ottenere qualsiasi panoramica dei valori di uscita (ad esempio, 139 = .....)

Questo è il codice semplificato per la via:

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

Nota: L'esecuzione del file eseguibile C nella shell di Ubuntu non dà alcun errore (es. valore di uscita 0). Ma, facendo lo stesso comando in Java dà valore di uscita 139.

+2

139 è un errore _Segmentation_. Significa che la tua _c-app_ sta accedendo alla memoria a cui non dovrebbe accedere. – npe

+0

[Questo] (http://stackoverflow.com/a/4842719/828625) risponde alla tua domanda credo. –

+1

Trovato [this] (http://tldp.org/LDP/abs/html/exitcodes.html), ma non so quanto sia significativo per te. –

risposta

4

Se il sistema uccide la propria applicazione (come nel caso di Segmentation fault) imposta il codice di uscita a 128 + SEGNALE - vedere linux signal(7) manpage per valori del segnale .

Inoltre, per linux, esistono diversi codici di uscita predefiniti definiti nel file di intestazione sysexits.h e si consiglia ai programmatori di utilizzare tali costanti anziché definire manualmente i propri valori. Da exit(3) manpage:

BSD ha tentato di standardizzare i codici di uscita; vedere il file <sysexits.h>.

È possibile trovare il file, ad esempio here, ed i valori inclusi sono:

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

Tuttavia, il loro utilizzo non è obbligatorio, e si è liberi di utilizzare qualsiasi valore che si desidera.

La risposta generale è: se l'applicazione fallisce con garbo (cioè è in grado di gestire l'errore in un'esecuzione di fine), imposta il codice di uscita da sola. Se l'applicazione viene uccisa dal sistema, è il sistema che imposta il codice di uscita.

È inoltre possibile vedere this thread per alcune informazioni aggiuntive.