2011-12-23 12 views
5

sto testando questo piccolo programma sotto 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; 
} 

Non importa ciò che viene immessa nella riga di comando, un echo $? stampa sempre 0, ad esempio:

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

La mia domanda è: perché $? non ha lo stesso valore di n? Ho anche testato il programma in Win32 e echo %errorlevel% fornisce lo stesso valore di n. Grazie!

+0

E puoi solo riprodurre il comportamento quando 'sistema()' è coinvolto? (Viene restituito un valore negativo, no? È definito in Linux?) –

+0

Ho visto questo comportamento solo con 'system()'. Se eseguo './Anything' seguito da' echo $? ', L'output sarebbe 127. – wdscxsj

risposta

6

Se si stampa n in ottale o esadecimale, scoprirete che il byte basso è sempre 0.

Se return WEXITSTATUS(n);, il programma si esce con lo stato che si aspettano.

Leggi man system e man wait attentamente e capirai.

+0

Puoi anche solo passare n a exit(); vale a dire. 'exit (n);' –

+0

Grazie! Ora capisco. – wdscxsj

+1

@MarkTurner No, non puoi. 'return n;' da 'main()' risulterà in 'exit (n)' (quasi) immediatamente dopo il ritorno di 'main'. E * che * risulterà ancora in '$?' Essendo '0'. –

2

Solo inferiori 8 bit del valore di ritorno sono riconosciuti come stato di uscita, in quanto lo stato di uscita è calcolato WEXITSTATUS macro, vedi SUSv4

+0

Penso che intendiate bit 8 ~ 15? – wdscxsj

+0

Cosa ti fa pensare questo? – wRAR

+0

Mi dispiace, ho sbagliato. Grazie. – wdscxsj

Problemi correlati