EXIT(3)

NAZWA
exit - powoduje normalne zakończenie programu

SKŁADNIA
#include <stdlib.h>

void exit(int status);

OPIS
Funkcja exit() powoduje normalne zakończenie procesu i zwrócenie procesowi-rodzicowi wartości status & 0377 (patrz 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.

WARTOŚĆ ZWRACANA
Funkcja exit() nie powraca.

ATRYBUTY
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-Unsafe race:exit

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

ZGODNE Z
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

UWAGI

Nie jest zdefiniowane, co się stanie, jeśli 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; patrz plik <sysexits.h>.

Po wywołaniu exit() kod zakończenia musi zostać przekazany do procesu macierzystego. Możliwe są trzy przypadki. Jeśli proces macierzysty ma ustawione SA_NOCLDWAIT lub ustawiony uchwyt SIGCHLD na SIG_IGN, to kod ten jest ignorowany. Jeśli proces macierzysty czekał na potomny, jest on powiadamiany o kodzie powrotu. W obu przypadkach kończący się proces ginie natychmiast. Jeśli proces macierzysty nie poinformował, że nie jest zainteresowany kodem zakończenia ani nie czeka, kończący się proces przechodzi w proces "zombie" (który nie zawiera nic oprócz pojedynczego bajtu reprezentującego kod zakończenia) tak, że proces macierzysty może poznać kod powrotu poprzez późniejsze wywołanie jednej z funkcji wait(2).

Jeśli implementacja wspiera 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 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).

ZOBACZ TAKŻE
_exit(2), setpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3)

O STRONIE
Angielska wersja tej strony pochodzi z wydania 4.07 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Adam Byrtek (PTM) <abyrtek@priv.onet.pl>, Andrzej Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 4.07 oryginału.