.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 1993 by Thomas Koenig <ig25@rz.uni-karlsruhe.de>
.\" and Copyright (c) 2004 by Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" Modified Sat Jul 24 13:30:06 1993 by Rik Faith <faith@cs.unc.edu>
.\" Modified Sun Aug 21 17:42:42 1994 by Rik Faith <faith@cs.unc.edu>
.\"          (Thanks to Koen Holtman <koen@win.tue.nl>)
.\" Modified Wed May 17 15:54:12 1995 by Rik Faith <faith@cs.unc.edu>
.\"           To remove *'s from status in macros (Thanks to Michael Shields).
.\" Modified as suggested by Nick Duffek <nsd@bbc.com>, aeb, 960426
.\" Modified Mon Jun 23 14:09:52 1997 by aeb - add EINTR.
.\" Modified Thu Nov 26 02:12:45 1998 by aeb - add SIGCHLD stuff.
.\" Modified Mon Jul 24 21:37:38 2000 by David A. Wheeler
.\"          <dwheeler@dwheeler.com> - noted thread issues.
.\" Modified 26 Jun 01 by Michael Kerrisk
.\"          Added __WCLONE, __WALL, and __WNOTHREAD descriptions
.\" Modified 2001-09-25, aeb
.\" Modified 26 Jun 01 by Michael Kerrisk, <mtk.manpages@gmail.com>
.\"	Updated notes on setting disposition of SIGCHLD to SIG_IGN
.\" 2004-11-11, mtk
.\"	Added waitid(2); added WCONTINUED and WIFCONTINUED()
.\"	Added text on SA_NOCLDSTOP
.\"	Updated discussion of SA_NOCLDWAIT to reflect 2.6 behavior
.\"	Much other text rewritten
.\" 2005-05-10, mtk, __W* flags can't be used with waitid()
.\" 2008-07-04, mtk, removed erroneous text about SA_NOCLDSTOP
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH wait 2 "2 maja 2024 r." "Linux man\-pages 6.8" 
.SH NAZWA
wait, waitpid, waitid \- oczekuje na zmianę stanu procesu
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <sys/wait.h>\fP
.P
\fBpid_t wait(int *_Nullable \fP\fIwstatus\fP\fB);\fP
\fBpid_t waitpid(pid_t \fP\fIpid\fP\fB, int *_Nullable \fP\fIwstatus\fP\fB, int \fP\fIoptions\fP\fB);\fP
.P
\fBint waitid(idtype_t \fP\fIidtype\fP\fB, id_t \fP\fIid\fP\fB, siginfo_t *\fP\fIinfop\fP\fB, int \fP\fIoptions\fP\fB);\fP
                /* Jest to interfejs glibc i POSIX; zob. UWAGI, aby
                   uzyskać informacje o surowym wywołaniu systemowym. */
.fi
.P
.RS -4
Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)):
.RE
.P
\fBwaitid\fP():
.nf
.\"    (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED)
    Od glibc 2.26:
        _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200809L
    glibc 2.25 i wcześniejsze:
        _XOPEN_SOURCE
            || /* Od glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
            || /* glibc <= 2.19: */ _BSD_SOURCE
.fi
.SH OPIS
Wszystkie te wywołania systemowe służą do oczekiwania na zmianę statusu
potomka procesu wywołującego oraz do uzyskania informacji o potomku, którego
stan uległ zmianie. Za zmianę stanu uważa się: zakończenie potomka,
zatrzymanie potomka przez sygnał, wznowienie potomka przez sygnał. W
przypadku zakończonego potomka, wykonanie oczekiwania pozwala systemowi na
zwolnienie zasobów związanych z potomkiem; gdyby oczekiwanie nie zostało
wykonane, to potomek pozostałby w stanie \[Bq]zombie\[rq] (zob. UWAGI
poniżej).
.P
Jeśli stan potomka już uległ zmianie, to te wywołania niezwłocznie
powrócą. W przeciwnym przypadku zablokują, do momentu zmiany stanu potomka
lub przerwania wywołania przez procedurę obsługi sygnału (zakładając, że
wywołania systemowe nie są automatycznie uruchamiane ponownie ze względu na
znacznik \fBSA_RESTART\fP \fBsigaction\fP(2)). W pozostałej części niniejszego
podręcznika, potomek, którego stan uległ zmianie, ale na którego jeszcze nie
poczekano za pomocą opisywanych wywołań systemowych, będzie określany
terminem \fIoczekiwalnego\fP.
.SS "wait() i waitpid()"
Wywołanie systemowe \fBwait\fP() wstrzymuje wykonanie wątku wywołującego,
dopóki nie zakończy się jeden z jego potomków. Wywołanie \fIwait(&wstatus)\fP
jest równoważne:
.P
.in +4n
.EX
waitpid(\-1, &wstatus, 0);
.EE
.in
.P
Wywołanie systemowe \fBwaitpid\fP() wstrzymuje wykonanie wątku wywołującego,
dopóki potomek określony argumentem \fIpid\fP nie zmieni stanu. Domyślnie,
\fBwaitpid\fP() czeka jedynie na zatrzymanie potomka, lecz to zachowanie można
zmienić argumentem \fIoptions\fP, jak opisano niżej.
.P
Wartość \fIpid\fP może wynosić:
.TP 
< \fB\-1\fP
oznacza oczekiwanie na dowolnego potomka, którego identyfikator grupy
procesów jest równy modułowi wartości (wartości bezwzględnej) \fIpid\fP.
.TP 
\fB\-1\fP
oznacza oczekiwanie na dowolnego potomka.
.TP 
\fB0\fP
oznacza oczekiwanie na dowolnego potomka, którego identyfikator grupy
procesów jest równy identyfikatorowi procesu wołającego, w momencie
wywołania \fBwaitpid\fP().
.TP 
> \fB0\fP
oznacza oczekiwanie na potomka, którego PID jest równy wartości \fIpid\fP.
.P
Wartość \fIoptions\fP jest sumą (OR) zera lub więcej spośród następujących
stałych:
.TP 
\fBWNOHANG\fP
oznacza natychmiastowy powrót z funkcji, jeśli potomek nie zakończył pracy.
.TP 
\fBWUNTRACED\fP
powraca również, jeśli potomek został zatrzymany (lecz nie śledzony za
pomocą \fBptrace\fP(2)). Status potomków \fIśledzonych\fP, które są zatrzymane
jest zapewniany nawet gdy nie podano tej opcji.
.TP 
\fBWCONTINUED\fP (od Linuksa 2.6.10)
powraca również, jeśli zatrzymany potomek został wznowiony sygnałem
\fBSIGCONT\fP.
.P
(Poniższe opcje dotyczą wyłącznie Linuksa.)
.P
Jeśli \fIwstatus\fP nie wynosi NULL, to \fBwait\fP() i \fBwaitpid\fP() przechowują
informacje o statusie w \fIint\fP, na którą on wskazuje. Liczbę tę można
sprawdzić następującymi makrami (które jako argument przyjmują nie wskaźnik
do niej, jak czynią to \fBwait\fP() i \fBwaitpid\fP(), lecz samą liczbę!):
.TP 
\fBWIFEXITED(\fP\fIwstatus\fP\fB)\fP
zwraca prawdę, jeśli potomek zakończył się w sposób normalny tj. wywołując
\fBexit\fP(3) lub \fB_exit\fP(2) albo powracając z main().
.TP 
\fBWEXITSTATUS(\fP\fIwstatus\fP\fB)\fP
zwraca status zakończenia potomka. Składa się on z ośmiu najmniej znaczących
bitów argumentu \fIstatus\fP, które potomek podał w wywołaniu do \fBexit\fP(3) lub
\fB_exit\fP(2) albo argumentu powrotnego z main(). Makro to może być
przetwarzane tylko jeśli \fBWIFEXITED\fP zwróciło prawdę.
.TP 
\fBWIFSIGNALED(\fP\fIwstatus\fP\fB)\fP
zwraca prawdę, jeśli potomek został zakończony sygnałem.
.TP 
\fBWTERMSIG(\fP\fIwstatus\fP\fB)\fP
zwraca numer sygnału, który spowodował zakończenie procesu potomnego. Makro
to powinno być używane tylko po zwróceniu prawdy przez \fBWIFSIGNALED\fP.
.TP 
\fBWIFSTOPPED(\fP\fIwstatus\fP\fB)\fP
zwraca prawdę, jeśli potomek dokonał zrzutu pamięci (zob. \fBcore\fP(5)). Makra
tego należy używać tylko wówczas, gdy \fBWIFSIGNALED\fP zwróciło prawdę.
.IP
Makro nie jest określone w POSIX.1\-2001 i nie jest dostępne w niektórych
implementacjach Uniksa (np. AIX, SunOS). Należy go zatem używać wewnątrz
\fI#ifdef WCOREDUMP ... #endif\fP.
.TP 
\fBWIFSTOPPED(\fP\fIwstatus\fP\fB)\fP
zwraca prawdę, jeśli proces potomny został zatrzymany po dostarczeniu
sygnału; jest to możliwe tylko jeśli wywołanie wykonano z użyciem
\fBWUNTRACED\fP lub gdy potomek jest śledzony (zob. \fBptrace\fP(2)).
.TP 
\fBWSTOPSIG(\fP\fIwstatus\fP\fB)\fP
zwraca numer sygnału, który spowodował zatrzymanie potomka. Makro to może
być użyte tylko, gdy \fBWIFSTOPPED\fP zwróciło prawdę.
.TP 
\fBWIFCONTINUED(\fP\fIwstatus\fP\fB)\fP
(od Linuksa 2.6.10) zwraca prawdę, jeśli proces potomny został wznowiony, ze
względu na otrzymanie \fBSIGCONT\fP.
.SS waitid()
Wywołanie systemowe \fBwaitid\fP() (dostępne od Linuksa 2.6.9) udostępnia
precyzyjniejszą kontrolę nad stanem potomka, na którego się czeka.
.P
Argumenty \fIidtype\fP i \fIid\fP wybierają potomka (potomków), na którego się
oczekuje, jak poniżej:
.TP 
\fIidtype\fP == \fBP_PID\fP
Oczekuje na potomka, którego PID jest równy \fIid\fP.
.TP 
\fIidtype\fP == \fBP_PIDFD\fP (od Linuksa 5.4)
.\" commit 3695eae5fee0605f316fbaad0b9e3de791d7dfaf
Oczekuje na potomka, do którego odnosi się deskryptor pliku PID podany w
\fIid\fP (więcej informacji o deskryptorach pliku PID w podręczniku
\fBpidfd_open\fP(2)).
.TP 
\fIidtype\fP == \fBP_PGID\fP
.\" commit 821cc7b0b205c0df64cce59aacc330af251fa8f7
Oczekuje na dowolnego potomka, którego identyfikator grupy jest równy
\fIid\fP. Od Linuksa 5.4, jeśli \fIid\fP wynosi zero, to oczekuje na dowolnego
potomka z tej samej grupy procesów, co grupa procesu wywołującego w momencie
wywołania.
.TP 
\fIidtype\fP == \fBP_ALL\fP
Oczekuje na dowolnego potomka; \fIid\fP jest ignorowane.
.P
Zmianę statusu potomka, na którego się oczekuje, podaje się za pomocą sumy
(OR) jednego lub kilku poniższych znaczników w \fIoptions\fP:
.TP 
\fBWEXITED\fP
Oczekuje na potomka, który został zakończony.
.TP 
\fBWSTOPPED\fP
Oczekuje na potomka, który został zakończony za pomocą dostarczenia sygnału.
.TP 
\fBWCONTINUED\fP
Oczekuje na (poprzednio zatrzymanego) potomka, który został wznowiony
sygnałem \fBSIGCONT\fP.
.P
Ponadto, w \fIoptions\fP można zsumować poniższe znaczniki:
.TP 
\fBWNOHANG\fP
Tak jak w \fBwaitpid\fP().
.TP 
\fBWNOWAIT\fP
Pozostawia potomka w stanie oczekiwalnym; późniejszym wywołaniem oczekiwania
można następnie pobrać informacje o stanie potomka.
.P
Po pomyślnym powrocie, \fBwaitid\fP() uzupełnia następujące pola struktury
\fIsiginfo_t\fP, na którą wskazuje \fIinfop\fP:
.TP 
\fIsi_pid\fP
Identyfikator procesu potomnego.
.TP 
\fIsi_uid\fP
Rzeczywisty identyfikator użytkownika potomka (pole to nie jest ustawione w
większości innych implementacji).
.TP 
\fIsi_signo\fP
Zawsze ustawione na \fBSIGCHLD\fP.
.TP 
\fIsi_status\fP
Status zakończenia potomka, taki jak podany do \fB_exit\fP(2) (lub \fBexit\fP(3))
lub sygnał powodujący zakończenie, zatrzymanie lub kontynuowanie
potomka. Pole \fIsi_code\fP może posłużyć do określenia sposobu interpretacji
tego pola.
.TP 
\fIsi_code\fP
Ustawione na jeden z: \fBCLD_EXITED\fP (potomek wywołał \fB_exit\fP(2));
\fBCLD_KILLED\fP (potomek zabity sygnałem); \fBCLD_DUMPED\fP (potomek zabity
sygnałem, zrzucił pamięć); \fBCLD_STOPPED\fP (potomek zatrzymany sygnałem);
\fBCLD_TRAPPED\fP (śledzony potomek wyzwolił pułapkę) lub \fBCLD_CONTINUED\fP
(potomek kontynuował po otrzymaniu \fBSIGCONT\fP).
.P
Jeśli w \fIoptions\fP podano \fBWNOHANG\fP i nie było potomków w stanie
oczekiwalnym, to \fBwaitid\fP() zwróci bezzwłocznie 0, natomiast stan struktury
\fIsiginfo_t\fP, na którą wskazuje \fIinfop\fP zależy od implementacji. Aby (w
sposób przenośny) rozróżnić ten przypadek od sytuacji, gdy potomek był w
stanie oczekiwalnym, należy wyzerować pole \fIsi_pid\fP przed wywołaniem i
sprawdzić, czy wartość pola jest niezerowa, po powrocie wywołania.
.P
.\" POSIX.1-2001 leaves this possibility unspecified; most
.\" implementations (including Linux) zero out the structure
.\" in this case, but at least one implementation (AIX 5.1)
.\" does not -- MTK Nov 04
POSIX.1\-2008 Technical Corrigendum 1 (2013) dodaje wymaganie, że gdy w
\fIoptions\fP podano \fBWNOHANG\fP i nie było potomków w stanie oczekiwalnym, to
\fBwaitid\fP() powinno wyzerować pola \fIsi_pid\fP i \fIsi_signo\fP struktury. W
Linuksie i innych implementacjach, które przestrzegają tego wymagania, nie
ma potrzeby zerowania pola \fIsi_pid\fP, przed wywołaniem \fBwaitid\fP(). Obecnie,
nie wszystkie implementacje przestrzegają jednak tego wymagania POSIX.1.
.SH "WARTOŚĆ ZWRACANA"
\fBwait\fP(): po pomyślnym zakończeniu zwraca identyfikator procesu
zakończonego potomka, w razie błędu zwraca \-1.
.P
\fBwaitpid\fP(): po pomyślnym zakończeniu, zwraca identyfikator procesu,
którego stan uległ zmianie; jeśli podano \fBWNOHANG\fP i jeden lub więcej z
potomków podanych w \fIpid\fP istnieje, lecz nie zmienił jeszcze stanu,
zwracane jest 0. W przypadku niepowodzenia, zwracane jest \-1.
.P
.\" FIXME As reported by Vegard Nossum, if infop is NULL, then waitid()
.\" returns the PID of the child.  Either this is a bug, or it is intended
.\" behavior that needs to be documented.  See my Jan 2009 LKML mail
.\" "waitid() return value strangeness when infop is NULL".
\fBwaitid\fP(): zwraca 0 po pomyślnym zakończeniu lub gdy podano \fBWNOHANG\fP i
żaden z potomków podanych w \fIid\fP nie zmienił jeszcze stanu; w przypadku
błędu zwracane jest \-1.
.P
W przypadku niepowodzenia, wszystkie wywołania ustawiają \fIerrno\fP, wskazując
błąd.
.SH BŁĘDY
.TP 
\fBEAGAIN\fP
Deskryptor pliku PID podany w \fIid\fP jest nieblokujący, a proces do którego
się odnosi nie zakończył się.
.TP 
\fBECHILD\fP
(dla \fBwait\fP())  Proces wywołujący nie ma żadnych potomków, na których
jeszcze się nie czeka.
.TP 
\fBECHILD\fP
(dla \fBwaitpid\fP() lub \fBwaitid\fP())   Proces o zadanym \fIpid\fP (\fBwaitpid\fP())
lub \fIidtype\fP i \fIid\fP (\fBwaitid\fP()) 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 \fBSIGCHLD\fP na \fBSIG_IGN\fP; zob. także: wątki w
rozdziale \fIUwagi linuksowe\fP).
.TP 
\fBEINTR\fP
Nie ustawiono \fBWNOHANG\fP, a został przechwycony niezablokowany sygnał lub
\fBSIGCHLD\fP; zob. \fBsignal\fP(7).
.TP 
\fBEINVAL\fP
Argument \fIoptions\fP był niepoprawny.
.TP 
\fBESRCH\fP
(dla \fBwait\fP() lub \fBwaitpid\fP())  \fIpid\fP jest równe \fBINT_MIN\fP.
.SH WERSJE
.SS "Różnice biblioteki C/jądra"
\fBwait\fP() jest w rzeczywistością funkcją biblioteczną, która (w glibc) jest
zaimplementowana jako wywołanie do \fBwait4\fP(2).
.P
.\" e.g., i386 has the system call, but not x86-64
Na niektórych architekturach, nie ma wywołania systemowego \fBwaitpid\fP();
zamiast tego interfejs ten jest zaimplementowany jako opakowująca funkcja
biblioteki C, która wywołuje \fBwait4\fP(2).
.P
Surowe wywołanie systemowe \fBwaitid\fP() przyjmuje piąty argument, typu
\fIstruct rusage\ *\fP. Jeśli argument ten nie wynosi NULL, to jest używany do
zwrócenia informacji o użyciu zasobów potomka, w ten sam sposób jak
\fBwait4\fP(2). Więcej szczegółów w podręczniku \fBgetrusage\fP(2).
.SH STANDARDY
POSIX.1\-2008.
.SH HISTORIA
SVr4, 4.3BSD, POSIX.1\-2001.
.SH UWAGI
Potomek który się zakończy, ale na którego nie oczekiwano staje się
\[Bq]zombie\[rq]. Jądro przechowuje minimalny zbiór informacji o procesach
zombie (PID, status zakończenia, informacje o użyciu zasobów), aby pozwolić
później procesowi macierzystemu na wykonanie oczekiwania, aby pozyskać
informacje o potomku. Dopóki zombie nie zostanie usunięty z systemu poprzez
oczekiwanie, będzie zajmował miejsce w tablicy procesów jądra, a jeśli ta
tablica się wypełni, nie będzie można tworzyć nowych procesów. Jeśli proces
macierzysty zakończy się, to ewentualni potomkowie \[Bq]zombie\[rq], zostaną
zaadoptowani przez \fBinit\fP(1), (lub przez najbliższy proces dorzynający
(ang. subreaper), według definicji użycia operacji \fBPR_SET_CHILD_SUBREAPER\fP
\fBprctl\fP(2)); \fBinit\fP(1) automatycznie wykona odczekanie, w celu usunięcia
zombie.
.P
POSIX.1\-2001 określa, że jeśli jako dyspozycję sygnału \fBSIGCHLD\fP ustawiono
na \fBSIG_IGN\fP lub dla \fBSIGCHLD\fP ustawiono znacznik \fBSA_NOCLDWAIT\fP
(zob. \fBsigaction\fP(2)), to kończony potomek nie staje się zombie, a
wywołanie \fBwait\fP() lub \fBwaitpid\fP() zablokuje, dopóki wszyscy potomkowie
nie zakończą się, a następnie zawiedzie z \fIerrno\fP ustawionym na
\fBECHILD\fP. (Pierwotny standard POSIX pozostawiał zachowanie ustawienia
\fBSIGCHLD\fP na \fBSIG_IGN\fP nieokreślonym. Proszę zauważyć, że choć domyślną
dyspozycją \fBSIGCHLD\fP jest \[Bq]ignorowanie\[rq], to wyraźne ustawienie
dyspozycji na \fBSIG_IGN\fP daje inne zachowanie w stosunku do potomków procesu
zombie).
.P
Linux 2.6 jest zgodny z wymaganiami POSIX. Jednak Linux 2.4 (i wcześniejsze)
nie są: jeśli wywołanie \fBwait\fP() lub \fBwaitpid\fP() jest wykonywane z
ignorowaniem \fBSIGCHLD\fP, zachowuje się ono tak, jakby \fBSIGCHLD\fP nie były
ignorowane, to znaczy, wywołanie zostaje zablokowane do chwili zakończenia
następnego potomka, a następnie zwraca identyfikator procesu i status tego
potomka.
.SS "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 \fBclone\fP(2). Inne
funkcje, jak na przykład przenośne \fBpthread_create\fP(3) są zaimplementowane
przez wywołania funkcji \fBclone\fP(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.
.P
.\" commit 91c4e8ea8f05916df0c8a6f383508ac7c9e10dba
Następujące, specyficzne dla Linuksa opcje w \fIoptions\fP są przeznaczone dla
potomków utworzonych za pomocą \fBclone\fP(2); mogą być one również, od Linuksa
4.7, używane z \fBwaitid\fP():
.TP 
\fB__WCLONE\fP
.\" since 0.99pl10
Oczekuje tylko na potomków typu \[Bq]clone\[rq]. Jeśli opcja ta zostanie
pominięta oczekiwanie będzie występować tylko na potomków typu
\[Bq]nie\-clone\[rq]. (Potomek typu \[Bq]clone\[rq] to taki, który po
zakończeniu nie dostarcza swojemu procesowi macierzystemu sygnału lub
dostarcza sygnał inny niż \fBSIGCHLD\fP.) Opcja ta jest ignorowana, jeśli
ustawiona jest również opcja \fB__WALL\fP.
.TP 
\fB__WALL\fP (od Linuksa 2.4)
.\" since patch-2.3.48
Oczekuje na procesy potomne niezależnie od ich typu (\[Bq]clone\[rq] lub
\[Bq]non\-clone\[rq]).
.TP 
\fB__WNOTHREAD\fP (od Linuksa 2.4)
.\" since patch-2.4.0-test8
Nie oczekuje 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.
.P
.\" commit bf959931ddb88c4e4366e96dd22e68fa0db9527c
.\" prevents cases where an unreapable zombie is created if
.\" /sbin/init doesn't use __WALL.
Od Linuksa 4.7, znacznik \fB__WALL\fP jest automatycznie dorozumiany, gdy
potomek jest śledzony (ptraced).
.SH USTERKI
Zgodnie z POSIX.1\-2008, aplikacje wywołujące \fBwaitid\fP() muszą upewnić się,
że \fIinfop\fP wskazuje na strukturę \fIsiginfo_t\fP (tj. jest nie to pusty
wskaźnik). W Linuksie, jeśli \fIinfop\fP wynosi NULL, to \fBwaitid\fP() kończy się
powodzeniem, zwracając identyfikator procesu oczekiwanego potomka. Aplikacje
powinny unikać polegania na tym niespójnym, niestandardowym i niepotrzebnym
zachowaniu.
.SH PRZYKŁADY
.\" fork.2 refers to this example program.
Poniższy program demonstruje użycie \fBfork\fP(2) i \fBwaitpid\fP(). Program
tworzy proces potomny. Jeśli nie poda się argumentów wiersza poleceń,
potomek zawiesza swoje wykonanie za pomocą \fBpause\fP(2), aby pozwolić
użytkownikowi wysyłać sygnały do potomka. W przeciwnym przypadku, gdy poda
się argumenty wiersza poleceń, potomek bezzwłocznie wychodzi, używając
liczby podanej w wierszu polecenia jako statusu zakończenia. Proces
macierzysty wykonuje pętlę monitorującą potomka za pomocą \fBwaitpid\fP() i
używa makr W*() opisanych powyżej, do analizy wartości statusu oczekiwania.
.P
Poniższa sesja powłoki demonstruje użycie programu:
.P
.in +4n
.EX
$\fB ./a.out &\fP
PID potomka to 32360
[1] 32359
$\fB kill \-STOP 32360\fP
zatrzymany sygnałem 19
$\fB kill \-CONT 32360\fP
wznowiony
$\fB kill \-TERM 32360\fP
zabity sygnałem 15
[1]+  Zakończony                    ./a.out
$
.EE
.in
.SS "Kod źródłowy programu"
.\" SRC BEGIN (wait.c)
\&
.EX
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
\&
int
main(int argc, char *argv[])
{
    int    wstatus;
    pid_t  cpid, w;
\&
    cpid = fork();
    if (cpid == \-1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
\&
    if (cpid == 0) {            /* Kod wykonywany przez potomka */
        printf("PID potomka to %jd\en", (intmax_t) getpid());
        if (argc == 1)
            pause();                    /* Oczekiwanie na sygnały */
        _exit(atoi(argv[1]));
\&
    } else {                    /* Kod wykonywany przez rodzica */
        do {
            w = waitpid(cpid, &wstatus, WUNTRACED | WCONTINUED);
            if (w == \-1) {
                perror("waitpid");
                exit(EXIT_FAILURE);
            }
\&
            if (WIFEXITED(wstatus)) {
                printf("wyszedł, status=%d\en", WEXITSTATUS(wstatus));
            } else if (WIFSIGNALED(wstatus)) {
                printf("zabity sygnałem %d\en", WTERMSIG(wstatus));
            } else if (WIFSTOPPED(wstatus)) {
                printf("zatrzymany sygnałem %d\en", WSTOPSIG(wstatus));
            } else if (WIFCONTINUED(wstatus)) {
                printf("wznowiony\en");
            }
        } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus));
        exit(EXIT_SUCCESS);
    }
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fB_exit\fP(2), \fBclone\fP(2), \fBfork\fP(2), \fBkill\fP(2), \fBptrace\fP(2),
\fBsigaction\fP(2), \fBsignal\fP(2), \fBwait4\fP(2), \fBpthread_create\fP(3),
\fBcore\fP(5), \fBcredentials\fP(7), \fBsignal\fP(7)
.PP
.SH TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
