2008-10-07 34 views
29

En caso afirmativo, ¿en qué sistema operativo, shell o lo que sea?ExitCodes mayor que 255, posible?

Considere el siguiente programa de java (estoy usando Java sólo como ejemplo, cualquier idioma sería bueno para esta pregunta, lo que es más acerca de los sistemas de operación):

public class ExitCode { 
    public static void main(String args[]) { 
     System.exit(Integer.parseInt(args[0])); 
    } 
} 

ejecutarlo en Linux y bash , siempre devuelve valores menos iguales a 255, por ejemplo (echo $? imprime el código de salida del comando anterior ejecutada)

> java ExitCode 2; echo $? 
2 

> java ExitCode 128; echo $? 
128 

> java ExitCode 255; echo $? 
255 

> java ExitCode 256; echo $? 
0 

> java ExitCode 65536; echo $? 
0 

Editado: la respuesta (sólo, hasta ahora) por debajo totalmente a explicar lo que sucede en UNIXes. Todavía me estoy preguntando sobre otros sistemas operativos.

+2

[Esta pregunta duplicada] (http://stackoverflow.com/q/5149228/824425) tiene [una respuesta mucho mejor (pero no aceptada)] (http://stackoverflow.com/a/5149399/824425) . –

Respuesta

30

No es posible en Unix y sus derivados. La información de estado de salida devuelta consta de dos campos de 8 bits, uno que contiene el estado de salida y el otro que contiene información sobre la causa de la muerte (0 implica salida ordenada bajo control de programa, otros valores que indican que una señal lo mató e indicando si un núcleo fue abandonado).

0

Windows tiene muchos más códigos de salida, más de 14,000. (Estoy seguro de que a menudo vio algunos de ellos en su propia pantalla).

Aquí viene:

+8

Estás hablando de los códigos de error devueltos por las API estándar de Windows. El OP quiere saber qué códigos de error puede devolver para su propio programa. –

+1

no, Windows admite código de salida de 32 bits => más de 4 mil millones –

13

En Windows moderno, el sistema operativo en sí, y la cáscara de la consola por defecto (CMD.EXE), aceptar y mostrar los códigos de salida a lo largo de al menos toda la gama de enteros con signo de 32 bits. El funcionamiento de su ejemplo anterior en CMD.EXE da la códigos de salida que solicitó:

> java ExitCode 2 
> echo %errorlevel% 
2 

> java ExitCode 128 
> echo %errorlevel% 
128 

> java ExitCode 255 
> echo %errorlevel% 
255 

> java ExitCode 256 
> echo %errorlevel% 
256 

> java ExitCode 65536 
> echo %errorlevel% 
65536 

Windows no tiene realmente el concepto de señales de Unix, ni tratar de secuestrar el código de salida para añadir información extra, por lo que siempre como su caparazón (o cualquier programa que termine leyendo el código de salida) tampoco lo hace, debe recuperar los códigos de salida que devolvió. Afortunadamente, los programas que utilizan el tiempo de ejecución de C de Microsoft (incluidos todos los programas compilados con MS Visual C++) conservan el código de salida tal como está al salir de los procesos.