exit(3) Library Functions Manual exit(3) NAZWA exit - powoduje normalne zakonczenie programu BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include [[noreturn]] void exit(int status); OPIS Funkcja exit() powoduje normalne zakonczenie procesu i zwrocenie najmniej znaczacego bajtu statusu status & 0xFF) procesowi macierzystemu (zob. wait(2)). Wszystkie funkcje zarejestrowane przez atexit(3) i on_exit(3) sa wywolywane w kolejnosci odwrotnej do kolejnosci ich rejestracji. (Mozliwe jest, aby ktorakolwiek z tych funkcji uzyla atexit(3) lub on_exit(3), aby zarejestrowac dodatkowe funkcje wykonywane podczas konczenia dzialania procesu; nowe funkcje sa dodawane na poczatek listy funkcji przeznaczonych do wywolania). Jesli jedna z tych funkcji nie powroci (to jest wywola _exit(2) lub sie zabije za pomoca sygnalu), to zadna z pozostalych funkcji nie bedzie wywolana i dalsze przetwarzanie (w szczegolnosci oproznianie strumieni stdio(3)) jest przerywane. Jesli ta sama funkcja zostanie zarejestrowana za pomoca atexit(3) lub on_exit(3) wiecej niz raz, to bedzie wywolana tyle razy, ile razy byla zarejestrowana. Wszystkie otwarte strumienie stdio(3) sa oprozniane i zamykane. Pliki utworzone przez tmpfile(3) sa usuwane. Standard C wymienia dwie definicje EXIT_SUCCESS i EXIT_FAILURE, ktore moga zostac przekazane do exit(), aby wskazac, odpowiednio, czy zakonczenie bylo pomyslne, czy tez nie. WARTOSC ZWRACANA Funkcja exit() nie powraca. ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +--------------+--------------------------+----------------------------+ |Interfejs | Atrybut | Wartosc | +--------------+--------------------------+----------------------------+ |exit() | Bezpieczenstwo watkowe | MT-niebezpieczne race:exit | +--------------+--------------------------+----------------------------+ Funkcja exit() uzywa niezabezpieczonej zmiennej globalnej, w zwiazku z czym nie jest watkowo 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) wywola exit() lub longjmp(3). Prosze zauwazyc, ze wywolanie execve(2) usuwa rejestracje utworzone przez atexit(3) i on_exit(3). Uzywanie EXIT_SUCCESS i EXIT_FAILURE zamiast 0 i pewnej wartosci niezerowej, jak 1 lub -1, zapewnia nieco lepsza przenosnosc (do srodowisk nieuniksowych). W szczegolnosci VMS uzywa innej konwencji. BSD probowal zestandaryzowac kody zakonczenia (co przyjely niektore biblioteki C, w tym takze biblioteka GNU C); patrz plik . Po wykonaniu exit(), status zakonczenia musi byc przetransmitowany do procesu macierzystego. Wystepuja trzy przypadki: o Jesli proces macierzysty ma ustawione SA_NOCLDWAIT lub ma ustawiona procedure obslugi SIGCHLD na SIG_IGN, to status jest odrzucany, a potomek natychmiast ginie. o Jesli proces macierzysty oczekiwal na potomka, jest on informowany o statusie zakonczenia, a potomek natychmiast ginie. o W innych sytuacjach, potomek staje sie procesem ,,zombie": wiekszosc zasobow procesu jest odzyskiwana, jednak wpis zawierajacy minimalna dawke informacji o procesie potomnym (status zakonczenia, statystyki uzycia zasobow) jest zachowywany w tablicy procesow. Pozwala to procesowi macierzystemu na pozniejsze uzycie waitpid(2) (lub podobnego), aby poznac status zakonczenia potomka; w tym momencie wpis procesu zombie jest zwalniany. Jesli implementacja obsluguje sygnal SIGCHLD, to zostanie on wyslany do procesu macierzystego. Jesli proces macierzysty ustawil SA_NOCLDWAIT, to nie jest zdefiniowane, czy sygnal SIGCHLD zostanie wyslany. Sygnaly wysylane do innych procesow Jesli proces wychodzacy jest inicjatorem sesji a sterujacy nim terminal jest terminalem sterujacym dla sesji, to do kazdego z procesow nalezacych do grupy procesow pierwszoplanowych tego terminala sterujacego, zostanie wyslany sygnal SIGHUP, a terminal zostanie odlaczony od sesji umozliwiajac jego przejecie przez nowy proces sterujacy. Jesli zakonczenie procesu powoduje osierocenie grupy procesow, a ktorykolwiek z czlonkow nowo osieroconej grupy procesow jest zatrzymany, to po sygnale SIGHUP do kazdego z procesow tej grupy procesow zostanie wyslany sygnal SIGCONT. Opis osieroconych grup procesow mozna znalezc w podreczniku setpgid(2). Za wyjatkiem przypadkow opisanych powyzej, gdy sygnalizowane procesy moga byc potomkami procesu konczonego, zakonczenie procesu zwykle nie powoduje wyslania sygnalu do potomkow tego procesu. Jednakze proces moze skorzystac z operacji PR_SET_PDEATHSIG prctl(2), aby spowodowac otrzymanie sygnalu, gdy jego rodzic zakonczy sie. ZOBACZ TAKZE _exit(2), get_robust_list(2), setpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Adam Byrtek , Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 2 maja 2024 r. exit(3)