Stan wyjścia

Status wyjścia procesu w programowaniu komputerowym to niewielka liczba przekazywana z procesu potomnego (lub odbiorcy) do procesu nadrzędnego (lub wywołującego), gdy zakończy on wykonywanie określonej procedury lub delegowanego zadania. W systemie DOS można to nazwać poziomem błędu .

Kiedy programy komputerowe są wykonywane, system operacyjny tworzy abstrakcyjną jednostkę zwaną procesem , w którym prowadzona jest księgowość dla tego programu. W wielozadaniowych systemach operacyjnych, takich jak Unix czy Linux , nowe procesy mogą być tworzone przez aktywne procesy. Proces, który tworzy inny, nazywany jest procesem nadrzędnym , podczas gdy te, które zostały utworzone, są procesami potomnymi . Procesy potomne działają równolegle z procesem nadrzędnym. Technika spawnowania procesów potomnych służy do delegowania części pracy procesowi potomnemu, gdy nie ma powodu, aby zatrzymać wykonywanie rodzica. Kiedy dziecko kończy wykonywanie, kończy działanie, wywołując wywołanie systemowe wyjścia . To wywołanie systemowe ułatwia przekazanie kodu stanu wyjścia z powrotem do rodzica, który może pobrać tę wartość za pomocą wywołania systemowego wait .

Semantyka

Rodzic i dziecko mogą zrozumieć znaczenie statusów wyjścia. Na przykład powszechną praktyką programistyczną jest zwracanie przez proces potomny (wyjście z) zerem do rodzica, co oznacza sukces. Oprócz tej wartości zwracanej przez dziecko, inne informacje, takie jak sposób zakończenia procesu, normalnie lub za pomocą sygnału, mogą być również dostępne dla procesu nadrzędnego.

Konkretny zestaw zwróconych kodów jest unikalny dla programu, który go ustawia. Zwykle wskazuje na sukces lub porażkę. Wartość kodu zwracanego przez funkcję lub program może wskazywać na konkretną przyczynę niepowodzenia. W wielu systemach im wyższa wartość, tym poważniejsza przyczyna błędu. Alternatywnie, każdy bit może wskazywać inny warunek, przy czym są one oceniane razem przez operatora lub w celu uzyskania wartości końcowej; na przykład fsck .

Czasami, jeśli kody są zaprojektowane z myślą o tym celu, można ich użyć bezpośrednio jako indeksu gałęzi po powrocie do programu inicjującego, aby uniknąć dodatkowych testów.

AmigaOS

W AmigaOS , MorphOS i AROS zdefiniowane są cztery poziomy:

  • OK 0
  • OSTRZEŻENIE 5
  • BŁĄD 10
  • AWARIA 20

Powłoka i skrypty

Skrypty powłoki zazwyczaj wykonują polecenia i przechwytują ich statusy wyjścia.

Dla celów powłoki, polecenie, które kończy się z zerowym kodem wyjścia, powiodło się. Niezerowy status wyjścia wskazuje na niepowodzenie. Ten pozornie sprzeczny z intuicją schemat jest używany, więc istnieje jeden dobrze zdefiniowany sposób wskazywania sukcesu i wiele sposobów wskazywania różnych trybów niepowodzeń. Gdy polecenie jest zakończone sygnałem o numerze N, powłoka ustawia zmienną $? do wartości większej niż 128. Większość powłok używa 128+N, podczas gdy ksh93 używa 256+N.

Jeśli polecenie nie zostanie znalezione, powłoka powinna zwrócić stan 127. Jeśli polecenie zostanie znalezione, ale nie jest wykonywalne, kod powrotu powinien wynosić 126. Należy zauważyć, że nie dotyczy to wszystkich powłok.

Jeśli polecenie nie powiedzie się z powodu błędu podczas interpretacji lub przekierowania, kod zakończenia jest większy od zera.

język C

Język programowania C umożliwia programom wychodzącym lub powracającym z funkcji main sygnalizowanie sukcesu lub niepowodzenia poprzez zwrócenie liczby całkowitej lub zwrócenie makr EXIT_SUCCESS i EXIT_FAILURE . W systemach uniksopodobnych są one równe odpowiednio 0 i 1. Program AC może również wykorzystywać exit() określającą jako pierwszy parametr status typu integer lub makro wyjścia.

Wartość zwracana z main jest przekazywana do funkcji wyjścia , która dla wartości zero, EXIT_SUCCESS lub EXIT_FAILURE może przełożyć ją na „formę zdefiniowaną w implementacji” pomyślnego lub nieudanego zakończenia .

Oprócz zera i makr EXIT_SUCCESS i EXIT_FAILURE standard C nie definiuje znaczenia kodów powrotu. Zasady korzystania z kodów zwrotnych różnią się na różnych platformach (zobacz sekcje dotyczące poszczególnych platform).

DOS

W terminologii systemu DOS poziom błędu to całkowity kod wyjścia zwracany przez wykonywalny program lub podprogram . Poziomy błędów zwykle mieszczą się w zakresie od 0 do 255. W DOS dostępnych jest tylko 256 kodów błędów, ale DR DOS 6.0 i nowsze obsługują 16-bitowe kody błędów przynajmniej w CONFIG.SYS . W 4DOS i DR-DOS COMMAND.COM kody zakończenia (w zadaniach wsadowych) można ustawić za pomocą EXIT n i (w CONFIG.SYS) za pomocą ERROR= n .

Statusy wyjścia są często przechwytywane przez programy wsadowe za pomocą poleceń IF ERRORLEVEL . Multiuser DOS obsługuje zarezerwowaną zmienną środowiskową %ERRORLVL% , która jest automatycznie aktualizowana po powrocie z aplikacji. COMMAND.COM pod DR-DOS 7.02 i nowszymi obsługuje podobną zmienną pseudo-środowiskową %ERRORLVL% oraz %ERRORLEVEL% . W CONFIG.SYS DR DOS 6.0 i nowsze obsługują ONERROR do testowania stanu obciążenia i kodu powrotu sterowników urządzeń oraz kodu zakończenia programów.

Jawa

W Javie każda metoda może wywołać System.exit(int status) , chyba że menedżer bezpieczeństwa na to nie zezwoli. Spowoduje to zakończenie aktualnie działającej maszyny wirtualnej Java. „Argument służy jako kod stanu; zgodnie z konwencją niezerowy kod stanu wskazuje na nieprawidłowe zakończenie”.

OpenVMS

W OpenVMS sukces jest wskazywany przez wartości nieparzyste, a niepowodzenie przez parzyste. Wartość to 32-bitowa liczba całkowita z polami podrzędnymi: bity kontrolne, numer obiektu, numer komunikatu i ważność. Wartości istotności są podzielone na powodzenie (Sukces, Informacja) i niepowodzenie (Ostrzeżenie, Błąd, Krytyczny).

POSIX

W systemie Unix i innych systemach zgodnych z POSIX proces nadrzędny może pobrać status zakończenia procesu potomnego za pomocą rodziny wywołań systemowych wait() zdefiniowanych w wait.h. Spośród nich wywołanie waitid() pobiera pełny 32-bitowy status wyjścia, ale starsze wywołania wait() i waitpid() pobierają tylko najmniej znaczące 8 bitów statusu wyjścia.

wait () i waitpid() ustawiają wartość statusu typu int spakowaną jako pole bitowe z różnymi typami potomnych informacji o zakończeniu. Jeśli dziecko zostało zakończone przez wyjście (zgodnie z WIFEXITED() ; zwykle alternatywą jest śmierć z powodu nieprzechwyconego sygnału ), SUS określa, że ​​8 bitów niższego rzędu statusu wyjścia można pobrać z wartości statusu za pomocą makro WEXITSTATUS () .

W wywołaniu systemowym waitid() (dodanym z SUSv1) status wyjścia podrzędnego i inne informacje nie znajdują się już w polu bitowym, ale w strukturze typu siginfo_t .

Systemy zgodne z POSIX zazwyczaj używają konwencji zero dla powodzenia i niezerowej dla błędów. Rozwinęły się pewne konwencje dotyczące względnych znaczeń różnych kodów błędów; na przykład GNU zaleca, aby kody z ustawionym wysokim bitem były zarezerwowane na poważne błędy.

Systemy operacyjne pochodzące z BSD zdefiniowały obszerny zestaw preferowanych interpretacji: Znaczenie 15 kodów stanu od 64 do 78 jest zdefiniowane w sysexits.h. Historycznie wywodzą się one z sendmaila i innych agentów przesyłania wiadomości , ale od tego czasu znalazły zastosowanie w wielu innych programach.

Advanced Bash-Scripting Guide i /usr/include/sysexits.h zawierają pewne informacje na temat znaczenia kodów statusu wyjścia innych niż 0.

Okna

Windows używa 32-bitowych liczb całkowitych bez znaku jako kodów wyjścia, chociaż interpreter poleceń traktuje je jako ze znakiem.

Kody wyjścia są bezpośrednio przywoływane, na przykład przez interpreter wiersza poleceń CMD.exe w terminologii poziomu błędów odziedziczonej z systemu DOS . Procesy .NET Framework i Windows PowerShell odnoszą się do tego jako do właściwości ExitCode obiektu Process .

Zobacz też