2011-11-10 9 views
10

Mam program C, który zwraca wartość całkowitą. Byłem zaskoczony, aby dowiedzieć się, że przy badaniu wartości zwracanej z poleceń powłoki uzyskać wartość modulo 256.Jaki jest poprawny zakres wartości zwracanej przez program w systemie Linux/bash?

/* prog.c */ 
int main(...) { return 257; } 

-

> ./prog.e 
> echo $? 
1 
  • Dlaczego nie mogę zobaczyć cały całkowitą ?
  • Gdzie to zachowanie jest udokumentowane?
  • Jak mogę pobrać całą wartość 32-bitową do powłoki?
+3

Wartości zwracane są z definicji kodami błędu. Nie możesz użyć zwracanej wartości do przekazania innej wartości liczbowej, * koniecznie * jest używana do wskazania sukcesu (0) lub błędu (niezerowego). Jeśli masz zamiar wypisać jakikolwiek rodzaj lub inną niezerową wartość liczbową podczas * udanego * wykonania, musisz napisać to do STDOUT. – meagar

+0

Dzięki, @meagar. Potrzebuję tego jako tymczasowego hackowania na jakimś nieprodukcyjnym kodzie, nad którym pracuję - w celu weryfikacji mojego rozwoju kodu wbudowanego. Rozumiem zastrzeżenie, o którym wspomniałeś, ale mimo to nie odpowiada na moje pytanie. – ysap

+0

Dlatego jest to komentarz, a nie odpowiedź.Komentarze nie mają * przypuszczać * odpowiedzi na pytania. Tymczasowe włamanie lub w inny sposób, nie będziesz w stanie zatrzymać numeru, który powracasz. Będziesz musiał wypisać go do STDOUT. – meagar

Odpowiedz

10

Gdy program wychodzi, to może powrócić do procesu macierzystego niewielką ilość informacji o przyczynie rozwiązania, wykorzystując status wyjścia. Jest to wartość z zakresu od 0 do 255, że proces kończący przekazuje jako argument do zakończenia.

http://www.gnu.org/s/hello/manual/libc/Exit-Status.html

alternatywnie:

http://en.wikipedia.org/wiki/Exit_status

pochodziła z kodów zwrotnych "POSIX" i "C" wracają kody odpowiednich wyszukiwań Google.

+0

Dzięki. Chyba mam tu szczęście. – ysap

1

Status powrotu jest wyjaśniony (rodzaj) w wait i powiązanych systemach.

zasadniczo:

WEXITSTATUS (stat_val)
Jeżeli wartość WIFEXITED (stat_val) jest różna od zera, to makro ocenia się niskiego rzędu 8 bitów argumentu wskazującą, że proces potomny przeszedł do _exit() lub exit() lub wartość, którą proces potomny zwrócił z main().

Ogranicza się do 8 bitów. Nie można w przenośni uzyskać więcej. (I nie wiem metody zależne od systemu, aby uzyskać więcej albo.)

3

Wyjaśnienie jest na samym szczycie man exit:

 
    The exit() function causes normal process termination and the value of 
    status & 0377 is returned to the parent (see wait(2)). 

Innymi słowy, tylko najniższe 8 bitów są propagowane do proces macierzysty.

Pod tym względem zwrot kodu wyjścia z main() nie różni się od podania go pod numer exit().

+0

Dzięki. Zajrzałem na stronę "man bash", ale nie mogłem tego znaleźć. Chyba b/c robiłem C Nie myślałem o patrzeniu na stronę 'exit'. – ysap