Provided by: manpages-pl-dev_20060617-1_all bug

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

       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)