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)
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/.