exit(3) | Library Functions Manual | exit(3) |
NAZWA
exit - powoduje normalne zakończenie programu
BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)
SKŁADNIA
#include <stdlib.h>
[[noreturn]] void exit(int status);
OPIS
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.
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-niebezpieczne race:exit |
Funkcja exit() używa niezabezpieczonej zmiennej globalnej, w związku z czym nie jest wątkowo bezpieczna.
STANDARDY
C11, POSIX.1-2008.
HISTORIA
C89, POSIX.1-2001, SVr4, 4.3BSD.
UWAGI
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.
Sygnały wysyłane do innych procesów
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ę.
ZOBACZ TAKŻE
_exit(2), get_robust_list(2), setpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3)
TŁUMACZENIE
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 |