Historia Uniksa: ósemkowy kod powrotu?

10

Zaskoczyło mnie dzisiaj gdb:

Program exited with code 0146.

gdbwypisuje kod powrotu ósemkowo ; sprawdzam, dlaczego znalazłem: http://comments.gmane.org/gmane.comp.gdb.devel/30363

Ale to nie jest szczególnie satysfakcjonująca odpowiedź. Szybkie wyszukiwanie w Google nie ujawniło historii, więc miałem nadzieję, że ktoś na SO może poznać historię z przeszłości.

Nieco powiązane pytanie, w jaki sposób można nawet wyświetlić kod powrotu ósemkowo? Być może starsze maszyny zawsze drukowały kod powrotu?

$ printf %o\\n $?

Jest dość niezręczny :)

Poklepać
źródło
$?jest wartość skorupy dla kodu powrotu, i jest cyfrą dziesiętną (lub robi gdb wsparcie Twój przykład cmd też?). Nie wiem, dlaczego gdb zgłasza to ósemkowo. Moim rozwiązaniem jest wydostanie się z pamięci, man asciiaby zobaczyć, co oznaczają wartości ósemkowe. Interesujące pytanie, ponieważ napotykasz także wartości ósemkowe z innych programów. Być może jest to omówione w „Unix Programming Envioronment” Kernighana i Pike'a. Powodzenia.
shellter
Status wyjścia może być większy niż cyfra, w rzeczywistości jest to bajt. Nie przydałby się również man asciido konwersji liczby ósemkowej na dziesiętną. bcbyłby lepszym wyborem.
jlliagre
2
Kod powrotu to liczba , nie dziesiętna ani ósemkowa. Program zwraca status (jeden bajt). Z oczekiwaniem (3) lub jego plemieniem proces macierzysty może dowiedzieć się wielu informacji o tym, dlaczego proces zakończył się (normalnie, tj. Dobrowolnie przez wywołanie wyjścia (2); zabity sygnałem, ...)
vonbrand,

Odpowiedzi:

6

Reprezentacja ósemkowa ułatwia interpretację kodu wyjścia dla małych wartości, które są najczęściej używane. Gdyby liczba ta, która jest bajtem, była drukowana w systemie dziesiętnym, znalezienie przerwanego sygnału wymagałoby trochę obliczeń w trybie ósemkowym, można je odczytać takimi, jakimi są:

  • proces kończy się ze statusem 5, gdbwyświetla, 05co nie ma znaczenia
  • kończenia procesu, ponieważ dostał SIGINT( Control+ C), gdbwyświetlacze 0202, które jest łatwiej rozpoznać jako sygnał # 2 ni 130.

Co więcej, status wyjścia może być również trochę maską iw takim przypadku ósemkowy (przynajmniej wtedy, gdy jesteś do tego przyzwyczajony, co było bardziej powszechne kilka dekad temu niż obecnie) jest łatwiejszy do mentalnego przekształcenia w bity niż dziesiętny, a nawet szesnastkowy, podobnie jak na przykład chmodjeszcze przyjąć liczbę ósemkową do reprezentowania uprawnienia do plików: 0750 = 111 101 000 = rwx r-x ---.

jlliagre
źródło
prawdopodobnie niewłaściwe miejsce, aby o to zapytać, ale czy istnieje prosty sposób na stwierdzenie, czy liczba podana przez GDB jest liczbą ósemkową czy dziesiętną?
marinara,
3
Konwencja jest taka, że ​​jeśli zaczyna się od zera (0), jest ósemkowa.
jlliagre
3

Nie mam kopii tego tekstu i po prostu przeczytałem krótki tekst dostępny w książkach Google, ale. Zgodnie z przewodnikiem X / Open Portability Specyfikacje System V Polecenia i narzędzia str 283 (według książek google)

jeśli aplikacja zakończy się nienormalnie, jej kodem wyjścia jest status ósemkowy 0200 + i istnieje lista wspólnych wartości „status” (które prawdopodobnie są również podawane w postaci ósemkowej).

Więc to / był zły komunikat o błędzie mans.


źródło