2010-09-17 8 views
20

estoy tratando de devolver un valor más grande como 1000 de mi función principal, pero cuando escribo echo $? se muestra 0.¿Por qué no puedo devolver valores más grandes desde la función principal?

Si vuelvo un valor más pequeño como 100 muestra el valor correcto.

Mi Código:

int main(void) 
{ 
    return 1000; 
} 

¿Hay alguna limitación en los valores que podemos volver?

+0

Obtengo ** 232 ** para 'return 1000;' y ** 233 ** para 'return 1001;' – Lazer

+5

** 1000% 256 = 232 ** – Lazer

Respuesta

22

Aquí hay dos conceptos relacionados: C exit status y bash return code. Ambos cubren el rango 0-255, pero bash usa números superiores a 126 para sus propios fines, por lo que sería confuso devolverlos de su programa.

Para estar seguro limite los códigos de estado de salida a 0-127, ya que es más portátil, al menos eso está implícito en http://docs.python.org/library/sys.html#sys.exit.

El estado de salida C se pone en el bash $? variable después de la ejecución, pero bash usa 127 para indicar 'comando no encontrado', por lo que es posible que desee evitarlo. Bash reference page.

Bash también usa 128-255 para las señales: indican que el proceso se canceló con una señal: exit code = 128 + signal number. Por lo tanto, es posible que consiga usar números cercanos a 255 ya que es poco probable que los números de señal lleguen a ese nivel.

Más allá de las líneas de guía comunes, hay muchos intentos de definir lo que los diferentes números deberían significar: http://tldp.org/LDP/abs/html/exitcodes.html.

Por lo tanto, si desea devolver un número entero arbitrario de su programa, probablemente sea mejor imprimirlo en stdout y capturarlo con VALUE=$(program) desde su secuencia de comandos bash.

+0

Creo que el rango es 0-255 (es decir, el rango de 'uint8_t') en sistemas * NIX: no está familiarizado con ningún sistema con un valor máximo de 127 (eso implicaría un tipo de devolución firmada equivalente a' int8_t', pero eso también implicaría un límite inferior de -128). –

+0

+1 Gracias por la explicación:) – Searock

+0

Además de indicar un rango incorrecto (como señaló @Jonathan), también parece confundir el estado de salida del programa (según lo informado por 'waitpid (2)') y el estado de salida del comando de shell (como reportado por '$?'). "128-255 se usan para señales" solo se aplica a este último. –

3

El valor de retorno de main (es decir, el estado de salida de la aplicación) está limitado al rango [0, 255] en * NIX. 1000 está fuera de rango, y el sistema operativo lo trata como 0, presumiblemente.

+2

No, al menos en bash, un estado de salida mayor que 255 devuelve el valor módulo 256. 1000 devolverá 232 –

+0

Eso es lo que supondría, en función de cómo C maneja los números, pero el OP dijo que obtenía 0 como resultado. –

1

En Unix-land, el valor de retorno de main es limitado porque exit se limita al rango de un byte de 8 bits.

En Windows hay un único valor, STILL_ACTIVE con valor 259, que es mejor evitar como código de salida del proceso.

Aparte de eso, en Windows puede devolver un código de 32 bits como HRESULT y eso se hace comúnmente.

Cuestiones relacionadas