2011-12-23 12 views
5

Estoy probando este pequeño programa en Linux:

// foo.c 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 
    int n = system(argv[1]); 
    printf("%d\n", n); 
    return n; 
} 

No importa lo que se introduce en la línea de comandos, un echo $? siempre imprime 0, por ejemplo:

$ ./foo anything 
sh: anything: not found 
32512 
$ echo $? 
0 

Mi pregunta es: ¿Por qué no $? toma el mismo valor que n? También probé el programa en Win32, y echo %errorlevel% da el mismo valor que n. ¡Gracias!

+0

Y pueden sólo reproducir el comportamiento cuando 'sistema()' se trata? (Se devuelve un valor negativo, ¿no? ¿Está esto definido en Linux?) –

+0

Solo he visto este comportamiento con 'system()'. Si ejecuto './Anything' seguido de' echo $? ', La salida sería 127. – wdscxsj

Respuesta

6

Si imprime n en octal o hexadecimal, descubrirá que el byte bajo de la misma es siempre 0.

Si return WEXITSTATUS(n);, el programa saldrá con el estado que está esperando.

Lea man system y man wait cuidadosamente, y comprenderá.

+0

También puede pasar n a exit(); es decir. 'exit (n);' –

+0

¡Gracias! Ahora lo entiendo – wdscxsj

+1

@MarkTurner No, no puedes. 'return n;' from 'main()' dará como resultado 'exit (n)' (almost) inmediatamente después de que 'main' regrese. Y * que * todavía resultará en '$?' Siendo '0'. –

2

Sólo 8 bits inferiores del valor de retorno se reconocen como el estado de salida, debido a que el estado de salida se calcula WEXITSTATUS macro, ver SUSv4

+0

Creo que te refieres a los bits 8 ~ 15? – wdscxsj

+0

¿Qué te hace pensar eso? – wRAR

+0

Lo siento, estaba equivocado. Gracias. – wdscxsj

Cuestiones relacionadas