Dlaczego otrzymuję błąd 255 podczas zwracania -1
On 17 lutego, 2021 by admin Jestem nowy w programowaniu w C ++ i mam bardzo podstawowe pytanie. Zauważyłem, że kiedy return -1
w programie C ++, a następnie sprawdzam stan wyjścia, otrzymuję 255
. Dlaczego tak jest?
Kod jest najbardziej podstawowy:
int main() { return -1; }
Następnie po uruchomieniu skompilowanego kodu:
echo $? 255
Odpowiedź
Ponieważ w systemie UNIX / POSIX kod zakończenia programu jest 8-bitowa wartość bez znaku. Przekształcenie -1 na 8-bitowe bez znaku daje 255.
Edytuj, aby dodać:
Aby podać więcej szczegółów: rodzina wywołań systemowych wait * () w systemie UNIX koduje wynik przetwarzać na jedną 32-bitową liczbę całkowitą. 32 bity tego wyniku są dalej dzielone w celu dostarczenia informacji, takich jak czy rdzeń procesu został zrzucony, wyszedł z powodu sygnału (i który) itp. Z tych 32 bitów tylko 8 jest zarezerwowanych dla kodu wyjścia procesu. a te są interpretowane jako wartości bez znaku.
Model fork / exec / wait systemu UNIX / POSIX jest jedną z jego najstarszych i najgłębiej osadzonych funkcji; gdybyś projektował dziś nowy system operacyjny, mógłbyś zrobić coś innego (przynajmniej użyj 64 bitów :-)).
Z drugiej strony, czy w praktyce naprawdę przydatne jest posiadanie> 255 kodów wyjścia? Wątpię. Jeśli naprawdę chciałbyś czegoś potężniejszego, sugerowałbym, abyś przełączył się na „ciąg wyjściowy” zamiast numerycznego kodu zakończenia z szerszym zakresem.
Komentarze
- Niezła zmiana. Dziękuję za dodatkowe informacje.
Odpowiedź
Cytat z bash
strona podręcznika na STATUS WYJŚCIA
Status wyjścia wykonanego polecenia to wartość zwracana przez wywołanie systemowe waitpid lub równoważną funkcję. Statusy wyjścia mieszczą się w przedziale od 0 do 255, chociaż, jak wyjaśniono poniżej, powłoka może specjalnie używać wartości powyżej 125. Statusy wyjścia z poleceń wbudowanych i poleceń złożonych również są ograniczone do tego zakresu. W pewnych okolicznościach powłoka użyje specjalnych wartości, aby wskazać określone tryby awarii.
Więc ogranicza ją do tego zakresu. jesteś.
Ze strony podręcznika waitpid (2)
:
WEXITSTATUS(status)
zwraca kod wyjścia dziecka. Składa się on z 8 najmniej znaczących bitów argumentu statusu określonego przez dziecko w wywołaniu exit (3) lub _exit ( 2) lub jako argument dla instrukcji return w main (). To makro powinno być stosowane tylko wtedy, gdy WIFEXITED zwróciło wartość true.
Dodaj komentarz