2011-12-23 16 views
5

jestem testowania tego małego programu pod Linuksem:

// 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; 
} 

Bez względu na to, co jest wprowadzany do linii poleceń, echo $? zawsze drukuje 0, np:

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

Moje pytanie brzmi: Dlaczego nie ma wartości $? ma tę samą wartość, co n? Przetestowałem także program pod Win32, a echo %errorlevel% daje tę samą wartość, co n. Dzięki!

+0

I można tylko odtworzyć zachowanie podczas 'System()' jest zaangażowany? (Zwracana jest wartość ujemna, czyż nie? Czy jest to zdefiniowane w Linuksie?) –

+0

Widziałem to zachowanie tylko z 'system()'. Jeśli wykonam './Coś', po którym następuje' echo $? ', Wynik będzie 127. – wdscxsj

Odpowiedz

6

przypadku drukowania n w ósemkowym lub hex, dowiesz się, że niski bajt to zawsze 0.

Jeśli return WEXITSTATUS(n);, program będzie wyjść ze stanu spodziewasz.

Uważnie przeczytaj man system i man wait, a zrozumiesz.

+0

Możesz również po prostu przekazać n do exit(); to znaczy. 'exit (n);' –

+0

Dziękujemy! Teraz to rozumiem. – wdscxsj

+1

@MarkTurner Nie, nie możesz. 'return n;' z 'main()' spowoduje 'exit (n)' (prawie) zaraz po zwróceniu 'main'. A * to * nadal spowoduje, że '$?' Będzie '0'. –

2

Tylko dolne 8 bitów zwracanej wartości są ujmowane jako status wyjścia, ponieważ kod wyjścia jest obliczana przez WEXITSTATUS makro, patrz SUSv4

+0

Myślę, że masz na myśli bity 8 ~ 15? – wdscxsj

+0

Co sprawia, że ​​tak myślisz? – wRAR

+0

Przepraszam, myliłem się. Dzięki. – wdscxsj

Powiązane problemy