exit(3) Library Functions Manual exit(3)

exit - powoduje normalne zakończenie programu

Standardowa biblioteka C (libc, -lc)

#include <stdlib.h>
[[noreturn]] void exit(int status);

Funkcja exit() powoduje normalne zakończenie procesu i zwrócenie najmniej znaczącego bajtu statusu status & 0xFF) procesowi macierzystemu (zob. wait(2)).

Wszystkie funkcje zarejestrowane przez atexit(3) i on_exit(3) są wywoływane w kolejności odwrotnej do kolejności ich rejestracji. (Możliwe jest, aby którakolwiek z tych funkcji użyła atexit(3) lub on_exit(3), aby zarejestrować dodatkowe funkcje wykonywane podczas kończenia działania procesu; nowe funkcje są dodawane na początek listy funkcji przeznaczonych do wywołania). Jeśli jedna z tych funkcji nie powróci (to jest wywoła _exit(2) lub się zabije za pomocą sygnału), to żadna z pozostałych funkcji nie będzie wywołana i dalsze przetwarzanie (w szczególności opróżnianie strumieni stdio(3)) jest przerywane. Jeśli ta sama funkcja zostanie zarejestrowana za pomocą atexit(3) lub on_exit(3) więcej niż raz, to będzie wywołana tyle razy, ile razy była zarejestrowana.

Wszystkie otwarte strumienie stdio(3) są opróżniane i zamykane. Pliki utworzone przez tmpfile(3) są usuwane.

Standard C wymienia dwie definicje EXIT_SUCCESS i EXIT_FAILURE, które mogą zostać przekazane do exit(), aby wskazać, odpowiednio, czy zakończenie było pomyślne, czy też nie.

Funkcja exit() nie powraca.

Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).

Interfejs Atrybut Wartość
exit() Bezpieczeństwo wątkowe MT-niebezpieczne race:exit

Funkcja exit() używa niezabezpieczonej zmiennej globalnej, w związku z czym nie jest wątkowo bezpieczna.

C11, POSIX.1-2008.

C89, POSIX.1-2001, SVr4, 4.3BSD.

Nie jest zdefiniowane zachowanie, gdy jedna z funkcji zarejestrowanych przez atexit(3) i on_exit(3) wywoła exit() lub longjmp(3). Proszę zauważyć, że wywołanie execve(2) usuwa rejestracje utworzone przez atexit(3) i on_exit(3).

Używanie EXIT_SUCCESS i EXIT_FAILURE zamiast 0 i pewnej wartości niezerowej, jak 1 lub -1, zapewnia nieco lepszą przenośność (do środowisk nieuniksowych). W szczególności VMS używa innej konwencji.

BSD próbował zestandaryzować kody zakończenia (co przyjęły niektóre biblioteki C, w tym także biblioteka GNU C); patrz plik <sysexits.h>.

Po wykonaniu exit(), status zakończenia musi być przetransmitowany do procesu macierzystego. Występują trzy przypadki:

Jeśli proces macierzysty ma ustawione SA_NOCLDWAIT lub ma ustawioną procedurę obsługi SIGCHLD na SIG_IGN, to status jest odrzucany, a potomek natychmiast ginie.
Jeśli proces macierzysty oczekiwał na potomka, jest on informowany o statusie zakończenia, a potomek natychmiast ginie.
W innych sytuacjach, potomek staje się procesem „zombie”: większość zasobów procesu jest odzyskiwana, jednak wpis zawierający minimalną dawkę informacji o procesie potomnym (status zakończenia, statystyki użycia zasobów) jest zachowywany w tablicy procesów. Pozwala to procesowi macierzystemu na późniejsze użycie waitpid(2) (lub podobnego), aby poznać status zakończenia potomka; w tym momencie wpis procesu zombie jest zwalniany.

Jeśli implementacja obsługuje sygnał SIGCHLD, to zostanie on wysłany do procesu macierzystego. Jeśli proces macierzysty ustawił SA_NOCLDWAIT, to nie jest zdefiniowane, czy sygnał SIGCHLD zostanie wysłany.

Jeśli proces wychodzący jest inicjatorem sesji a sterujący nim terminal jest terminalem sterującym dla sesji, to do każdego z procesów należących do grupy procesów pierwszoplanowych tego terminala sterującego, zostanie wysłany sygnał SIGHUP, a terminal zostanie odłączony od sesji umożliwiając jego przejęcie przez nowy proces sterujący.

Jeśli zakończenie procesu powoduje osierocenie grupy procesów, a którykolwiek z członków nowo osieroconej grupy procesów jest zatrzymany, to po sygnale SIGHUP do każdego z procesów tej grupy procesów zostanie wysłany sygnał SIGCONT. Opis osieroconych grup procesów można znaleźć w podręczniku setpgid(2).

Za wyjątkiem przypadków opisanych powyżej, gdy sygnalizowane procesy mogą być potomkami procesu kończonego, zakończenie procesu zwykle nie powoduje wysłania sygnału do potomków tego procesu. Jednakże proces może skorzystać z operacji PR_SET_PDEATHSIG prctl(2), aby spowodować otrzymanie sygnału, gdy jego rodzic zakończy się.

_exit(2), get_robust_list(2), setpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3)

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Adam Byrtek <alpha@irc.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

2 maja 2024 r. Linux man-pages 6.8