2012-06-20 19 views
5

Estoy usando Process a través de ProcessBuilder para ejecutar un ejecutable hecho en código C. Estoy capturando el Process.exitValue() para reaccionar en estos valores de salida. Noté que no todos los valores de salida son del ejecutable. Por ejemplo, obtengo un valor de salida de 139 y en ninguna parte de mi código C estoy devolviendo un valor de salida de 139.¿Cuál es el significado de los valores de Java Process.exitValue()?

Estoy tratando de encontrar una visión general de los valores de salida, pero no puedo encontrar esto, y ahora encontré el valor de salida puede depender del sistema operativo. (Estoy usando Ubuntu por cierto).

Parece que el único valor de salida para asegurarse es 0 cuando todo va bien. ¿Existen especificaciones sobre los valores de salida? ¿Puedo estar seguro de que cierto rango se puede usar solo para mi propio programa? Qué códigos de salida están reservados para el sistema operativo.

Descubrí que 139 es probablemente un error de memoria en el código C. Quiero deshacerme de lo probable. No puedo conseguir ninguna visión general de los valores de salida (por ejemplo, 139 = .....)

Este es el código simplificado por cierto:

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

Nota: La ejecución del ejecutable C en la cáscara de Ubuntu no da ningún error en absoluto (es decir, sale del valor 0). Pero, haciendo el mismo comando en Java da valor de salida 139.

+2

139 es un _Segmentation fault_. Significa que su _c-app_ está accediendo a la memoria a la que no debería acceder. – npe

+0

[Este] (http://stackoverflow.com/a/4842719/828625) responde a su pregunta, creo. –

+1

Encontrado [este] (http://tldp.org/LDP/abs/html/exitcodes.html) también, pero no sé lo significativo que es para usted. –

Respuesta

4

Si el sistema mata a su aplicación (como en el caso de Fallo de segmentación) que establece el código de salida de 128 + SEÑAL - ver Linux signal(7) manpage de valores de señal .

Además, para Linux, hay varios códigos de salida predeterminados definidos en el archivo de encabezado sysexits.h, y se recomienda que los programadores usen esas constantes en lugar de definir manualmente los valores propios. De exit(3) manpage:

BSD ha intentado estandarizar los códigos de salida; ver el archivo <sysexits.h>.

Usted puede encontrar el archivo, por ejemplo, here, y los valores que se incluyen son:

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

Sin embargo, su uso no es obligatorio, y usted es libre de usar cualquier valor que desee.

La respuesta general es: si la aplicación falla correctamente (es decir, es capaz de manejar el error y finalizar la ejecución), establece el código de salida por sí mismo. Si el sistema mata la aplicación, es el sistema quien establece el código de salida.

También puede ver this thread para obtener más información.

Cuestiones relacionadas