2011-12-24 10 views
58

En un programa C si queremos dar una entrada procedente del terminal entonces podemos darle por:¿Cómo puedo obtener lo que mi función principal ha devuelto?

int main(int argc, char *argv[]) 

De la misma manera, si queremos obtener el valor de retorno de main() función entonces ¿cómo podemos conseguirlo ?

En cada main() escribimos return 1 o return 0; ¿Cómo puedo saber qué ha devuelto mi main() en la terminal?

Edición: 1

lo entiendo que por echo $? podemos obtener el valor de retorno de main() pero sólo me permite devolver un valor inferior a 125 (en Linux) con éxito. Un valor de retorno más que eso no puede ser recibida con éxito por el $ variable por lo

qué es int el tipo de retorno de main()? ¿Por qué no mantenerlo short int?

Edit2

De dónde puedo encontrar el significado del código de error si main() devuelve un valor mayor que 125?

+4

No hay verdadera ventaja de elegir 'short' sobre' int' a menos que tengas un montón de ellos en el mismo lugar (matriz o estructura).No es más rápido tener un 'corto' y en los ABI modernos a menudo ni siquiera ahorras espacio al elegirlo. En algunos lugares, 'short' es más lento porque tiene que firmar la extensión cuando la carga. –

+0

sorprendido por un voto negativo .. !!! –

+1

@Jeegar Patel ... debes entender que algunas personas siempre odian –

Respuesta

45

La mayoría de las shells almacenan el código de salida del comando de ejecución anterior en $? para que pueda almacenarlo o mostrarlo.

$ ./a.out 
$ echo $?  # note - after this command $? contains the exit code of echo! 

o

$ ./a.out 
$ exit_code=$? # save the exit code in another shell variable. 

Tenga en cuenta que en Linux, a pesar de que regrese un int, en general, sólo los valores inferiores a 126 son seguros de usar. Los valores más altos se reservan para registrar otros errores que puedan ocurrir al intentar ejecutar un comando o para registrar qué señal, si la hay, finalizó su programa.

+2

No sé de un sabor UNIX que mantenga más que el más bajo 8 bits. –

+0

cuando devuelvo main() con -1, entonces muestra 127 ... ¿cómo? –

+2

@MikeDeSimone: Acabo de consultar la página de manual de bash, y en realidad es menos de lo que recordaba. Si intentas usar> 125, puedes colisionar con los valores que usa el shell. No estoy seguro acerca de otras conchas. –

40

Su shell probablemente tiene una variable especial $?, que contiene el último valor devuelto por el programa. Así, poco después de que su programa termine, puede ejecutar:

echo $? 

para ver el valor devuelto.

+0

cuando devuelvo main() con -1 y luego muestra 127..cómo? –

+3

Solo se interpretan los 8 bits bajos (es por eso que el valor devuelto debe estar en el rango 0-255). El 127 proviene de la representación de enteros negativos que luego se interpretan como sin signo. – sidyll

+6

@sidyll: Creo que te refieres a 7 bits, no a 8 bits. Los 8 bits bajos de -1 serían 255, los 7 bits bajos son 127. –

31

En DOS/Windows puede utilizar errorlevel dentro de un archivo por lotes

executable optional arguments 
if errorlevel 4 goto LABEL4 
if errorlevel 3 goto LABEL3 
if errorlevel 2 goto LABEL2 
if errorlevel 1 goto LABEL1 
:SUCCESS 
echo SUCCESS; errorlevel 0 
goto :eof 
:LABEL1 
echo FAILURE; errorlevel 1 
goto :eof 
:LABEL2 
echo FAILURE; errorlevel 2 
goto :eof 
REM ... 

Sólo recuerde para comprobar desde el mayor hasta el más bajo, porque if errorlevel 42 realmente significa "si nivel de error es 42 o mayor"

+9

-1 porque el autor etiquetó la pregunta con "linux". – AlexWebr

+4

+1 @Alex: buen punto. En mi defensa, solo noté la etiqueta después de comenzar a escribir la respuesta --- y decidí completarla y publicarla – pmg

+12

+1 Buena respuesta. Estaba buscando un método específico de Windows, que probablemente no necesite una pregunta por separado. – AbdullahC

6

Resumir comentarios y fragmentos para que estén en un solo lugar.

programa A C siempre tiene un código salida, que el programa puede decidir por sí mismo si se termina normalmente, mediante la devolución de un valor de la función main o llamando a la función exit. Si el programa termina anormalmente, por ejemplo, por una falla de segmentación, el sistema operativo decide el código de salida.

En Unix (Posix), el código de salida es un valor de 8 bits: 0-255. Se combina con algunos otros metadatos a un estado : los otros metadatos incluyen información acerca de si el programa terminó normalmente o no, si se terminó por una señal, y si es así, qué señal. Para obtener detalles, consulte la página del manual wait(2).

En Unix, en el shell, se puede acceder al estado del comando anterior como la variable especial $?. Como el código de salida es solo de 8 bits, y se trata como un entero sin signo, si devuelve un valor negativo, se convierte en uno positivo: -1 se convierte en 255. Del mismo modo, si devuelve un valor superior a 255 solo el mínimo se utilizan significativos 8 bits: 256 se convierte en 0.

El tipo de retorno de main es int, en lugar de short o char, porque no hay beneficio en particular en lo que es un tipo más pequeño, sobre todo en este momento de la historia, décadas después de que se fue decidido. Cambiarlo ahora solo causaría complicaciones innecesarias.

Si desea ejecutar un programa desde C, la biblioteca estándar proporciona la función system, que fácilmente devuelve el estado del programa. (Tenga en cuenta que system ejecuta comandos a través del shell, y debe tener mucho cuidado al escanear todo correctamente si le da al comando cualquier nombre de archivo provisto externamente u otras cosas en la línea de comandos.)

Para mayor flexibilidad, puede ejecutar otros programas que utilizan el sistema llaman al fork, execl (o una de sus variantes, consulte la página del manual exec(3)) y wait (ya mencionado anteriormente). Esto es poderoso y flexible, pero también es fácil cometer errores, así que asegúrese de leer la documentación y ver algunos ejemplos de programas primero. (Por otro lado, es muy divertido aprender esto.)

3

Puede obtener los valores de salida con el comando básico de Linux echo $? Los códigos de error son estándar y los detalles se explican en este link

Los códigos generales son

**

0- éxito

1- errores generales

126- permissi en cuestión

127-Ilegal comando

128-inválido argumentos y errores fatales

255-Fuera de rango **

Cuestiones relacionadas