wait

WAIT(2)                  Podręcznik programisty Linuksa                  WAIT(2)



NAZWA
       wait, waitpid - oczekiwanie na zakończenie procesu

SKŁADNIA
       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);
       pid_t waitpid(pid_t pid, int *status, int options);

OPIS
        Uwaga! To tłumaczenie może być nieaktualne!

       Funkcja wait zatrzymuje wykonywanie bieżącego procesu aż do zakończenia
       procesu potomka lub aż do dostarczenia sygnału kończącego bieżący proces
       lub innego, dla którego wywoływana jest funkcja obsługi sygnału. Jeśli
       potomek zakończył działanie przed wywołaniem tej funkcji (tak zwany
       proces-duch - "zombie"), to funkcja kończy się natychmiast. Wszelkie
       zasoby potomka są zwalniane.

       Funkcja waitpid zawiesza wykonywanie bieżącego procesu dopóki potomek
       określony przez pid nie zakończy działania lub dopóki nie zostanie
       dostarczony sygnał, którego akcją jest zakończenie procesu lub wywołanie
       funkcji obsługującej sygnały.  Jeśli potomek, podany jako pid, zakończył
       swoje działanie przed wywołaniem tej funkcji (tak zwany proces "zombie"),
       funkcja kończy się natychmiast. Wszelkie zasoby potomka są zwalnianie.

       Wartość pid może być:

       < -1   co oznacza oczekiwanie na dowolny proces potomny, którego ID grupy
              procesów jest równy wartości bezwzględnej pid.

       -1     co oznacza oczekiwanie na dowolny proces potomny; jest to takie
              samo zachowanie, jakie wykazuje wait.

       0      co oznacza oczekiwanie na każdy proces potomny, którego ID grupy
              procesu jest równe ID grupy procesu wywołującego funkcję.

       > 0    oznacza oczekiwanie na potomka, którego ID procesu jest równy
              wartości pid.

       Wartość options jest sumą OR zera lub więcej spośród następujących
       stałych:

       WNOHANG
              oznacza natychmiastowy powrót z funkcji, jeśli potomek nie
              zakończył pracy.

       WUNTRACED
              oznacza zakończenie także dla zatrzymanych (ale nie śledzonych)
              procesów potomnych, których stan jeszcze nie został zgłoszony.
              Stan śledzonych procesów potomnych, które zostały zatrzymane, jest
              udostępniany również bez tej opcji.

       (Poniższe opcje dotyczą wyłącznie Linuksa.)

       Jeśli status nie jest równe NULL, wait lub waitpid zapisuje dane o stanie
       w buforze wskazywanym przez status.

       Stan ten można zanalizować następującymi makrami (makra te pobierają jako
       argument bufor stat (typu int), — nie wskaźnik do bufora!):

       WIFEXITED(status)
              jest niezerowe, jeśli potomek normalnie zakończył pracę.

       WEXITSTATUS(status)
              analizuje osiem najmniej znaczących bitów kodu powrotu
              zakończonego potomka, które mogły być ustawione jako argument
              wywołania exit() lub jako argument instrukcji return w programie
              głównym. Makro to może być przetworzone, tylko jeśli WIFEXITED
              zwróciło wartość niezerową.

       WIFSIGNALED(status)
              zwraca prawdę, jeśli proces potomny zakończył pracę z powodu
              nieprzechwyconego sygnału.

       WTERMSIG(status)
              zwraca numer sygnału, który spowodował zakończenie procesu
              potomnego. Makro to może być przetworzone, tylko jeśli WIFSIGNALED
              zwróciło wartość niezerową.

       WIFSTOPPED(status)
              zwraca prawdę, jeśli proces potomny jest obecnie zatrzymany; jest
              to możliwe tylko gdy w wywołaniu użyto WUNTRACED oraz gdy proces
              potomny jest śledzony (zobacz ptrace(2)).

       WSTOPSIG(status)
              zwraca numer sygnału, który spowodował zatrzymanie potomka. Makro
              to może być przetworzone, tylko jeśli WIFSTOPPED zwróciło wartość
              niezerową.

       Niektóre wersje Uniksa (np. Linux, Solaris, ale nie AIX, SunOS) definiują
       także makro WCOREDUMP(status) sprawdzające, czy proces potomny dokonał
       zrzutu pamięci. Należy go używać tylko pomiędzy dyrektywami kompilatora
       #ifdef WCOREDUMP ... #endif.

WARTOŚĆ ZWRACANA
       PID zakończonego potomka lub zero, jeśli użyto WNOHANG, a nie było
       dostępnego żadnego potomka, albo -1 w przypadku błędu (w tym ostatnim
       wypadku odpowiednia wartość jest nadawana errno).

BŁĘDY
       ECHILD jeśli proces o zadanym pid nie istnieje lub nie jest potomkiem
              procesu wywołującego. (Może się to zdarzyć również w przypadku
              potomka, który ustawił akcję obsługi sygnału SIGCHLD na SIG_IGN.
              Zobacz także: wątki w sekcji UWAGI LINUKSOWE.)

       EINVAL jeśli argument options jest niepoprawny.

       EINTR  jeśli WNOHANG nie było ustawione, a został przechwycony
              niezablokowany sygnał lub SIGCHLD.

UWAGI
       Specyfikacja Single Unix Specification opisuje znacznik SA_NOCLDWAIT
       (nieobsługiwany pod Linuksem) taki, że jeżeli jest ustawiony ten znacznik
       albo akcja dla SIGCHLD jest ustawiona na SIG_IGN, to procesy potomne po
       zakończeniu nie stają się procesami-duchami ("zombies") i wywołanie
       funkcji wait() lub waitpid() zablokuje proces do czasu, gdy wszystkie
       procesy potomne zakończą działanie, a następnie zakończy się błędem z
       errno ustawionym na ECHILD.

       Oryginalny standard POSIX nie określa zachowania w przypadku ustawienia
       SIGCHLD na SIG_IGN. Późniejsze standardy, włączając SUSv2 i POSIX
       1003.1-2001 określają zachowanie w sposób taki, jaki opisano w opcji
       zgodności z XSI. Linux nie spełnia tego drugiego w dwóch opisanych
       powyżej punktach: jeśli wywołanie wait() lub waitpid() jest wykonywane z
       ignorowaniem SIGCHLD, zachowuje się ono tak, jakby SIGCHLD nie były
       ignorowane, to znaczy, wywołanie zostaje zablokowane do chwili
       zakończenia następnego potomka, a następnie zwraca PID i kod powrotu tego
       potomka.

UWAGI LINUKSOWE
       Pod Linuksem, wątek zarządzany przez jądro nie jest uruchamiany inaczej
       niż zwykły proces. Zamiast tego wątek jest po prostu procesem stworzonym
       przez wywołanie dostępnej tylko pod Linuksem funkcji systemowej clone(2).
       Inne funkcje, jak na przykład przenośne pthread_create(3) są
       zaimplementowane przez wywołania funkcji clone(2).  W wersjach Linuksa
       poprzedzających 2.4, wątek był po prostu specyficznym przypadkiem
       procesu. W związku z tym nie mógł on czekać na potomków innego wątku
       nawet w przypadku, gdy ten drugi wątek należał do tej samej grupy wątków.
       Jednakże, POSIX zaleca taką funkcjonalność, więc począwszy od Linuksa 2.4
       wątek może (i domyślnie będzie) czekać na potomków innych wątków
       należących do tej samej grupy wątków.

       Następujące, specyficzne dla Linuksa opcje w options są przeznaczone dla
       potomków utworzonych za pomocą clone(2).

       __WCLONE
              Oczekiwanie tylko na potomków typu "clone". Jeśli opcja ta
              zostanie pominięta będzie oczekiwanie tylko na potomków typu "nie-
              clone". (Potomek typu "clone" to taki, który po zakończeniu nie
              dostarcza swojemu procesowi macierzystemu sygnału lub dostarcza
              sygnał inny niż SIGCHLD.)  Opcja ta jest ignorowana, jeśli
              ustawiona jest również opcja __WALL.

       __WALL (Począwszy od Linuksa 2.4) Oczekiwanie na procesy potomne
              niezależnie od ich typu ("clone" lub "non-clone").

       __WNOTHREAD
              (Począwszy od Linuksa 2.4) Nie oczekiwać na procesy potomne innych
              wątków w obrębie tej samej grupy wątków. Było to w Linuksie
              domyślne przed wersją 2.4.

ZGODNE Z
       SVr4, POSIX.1

ZOBACZ TAKŻE
       clone(2), ptrace(2), signal(2), wait4(2), pthread_create(3), signal(7)

INFORMACJE O TŁUMACZENIU
       Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia
       Manuali i może nie być aktualne. W razie zauważenia różnic między
       powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub
       funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony
       podręcznika za pomocą polecenia:

              man --locale=C 2 wait

       Prosimy o pomoc w aktualizacji stron man - więcej informacji można
       znaleźć pod adresem http://sourceforge.net/projects/manpages-pl/.



Linux                              2000-07-24                            WAIT(2)