Widzę w dużo starszego oprogramowania i złych samouczków w Internecie, które zalecamy zastosowanie exit(-1)
, return -1
lub podobny do reprezentowania „nieprawidłowe zakończenie”. Problem w tym, że przynajmniej w POSIX -1
nigdy nie był i nie jest prawidłowym kodem statusu. man 3 exit
ilustruje, że exit()
zwraca wartość elementu status & 0377
nadrzędnego, co oznacza, że -1
staje się 255
. W systemach innych niż POSIX EXIT_FAILURE
zaleca się przenośność. Ale nigdy nie widzę, że „-1 oznacza nieprawidłowe zakończenie” w połączeniu z „EXIT_FAILURE może być czymś innym niż 1”, co wskazuje, że wyraźnie wierzą, że „-1” jest konwencjonalne nawet w systemach innych niż POSIX.
Oto przykład pytania StackOverflow, które to utrwala. Oprogramowanie „unrealircd” jest także przykładem programu, który używa exit(-1)
do zakończenia programu. W praktyce utrudnia to komunikację systemd
.
Skąd wziął się ten anty-wzór? Czy jest ważny w jakimś kontekście?
źródło
unsigned char
.char
ponieważ jego zakres wartości wynosi od -128 do 127. Ponadto stwierdziłem, że „-1” jest konwertowane na „255” w moim ciele zapytania .Odpowiedzi:
Prawie wszystkie komputery z systemem Unix używają dopełniania dwójkowego dla liczb całkowitych, a w komplementarnych dwójkach -1 oznacza zawsze „wszystkie bity 1” niezależnie od wielkości słowa. Jeśli chcesz mieć możliwie największy kod wyjścia, niezależnie od wielkości statusu wyjścia programu, użyj -1 i pozostawienie biblioteki przyciętej wygodnie.
Jest to przydatne, ponieważ gdy skrypty lub programy mają więcej niż jeden możliwy status wyjścia (patrz
grep
prosty przykład), te znaczące są zwykle przypisywane do najmniejszych liczb, co sprawia, że największy możliwy kod wyjścia jest dobry do użycia w przypadku „nieznanego błędu” lub „ przerwać ”, ponieważ jest mało prawdopodobne, aby kiedykolwiek wystąpił konflikt ze znaczącą wartością statusu.źródło
exit()
jakostatus &= 0xff
. Czy istnieje „rozmiar słowa”, w którym-1 & 0xff
nie jest 255? Oczywiście, że nie, ponieważ głównym celem jest dopasowanie go w zakresie 0–255. Niezależnie od tego ostatnie zdanie nie ma sensu: kody statusu 128-255 mają specjalne zastosowanie w systemach UNIX.