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