wait(2) wait(2)
NAME
wait, waitpid - Auf Anhalten oder Beenden von Sohnprozessen warten
SYNTAX
#include <sys/types.h>
#include <sys/wait.h>
pidt wait(int *statloc);
pidt waitpid(pidt pid, int *statloc, int options);
BESCHREIBUNG
Mit den Funktionen wait() und waitpid() kann der aufrufende Prozeß
Statusinformationen zu einem seiner Sohnprozesse erhalten. Über ver-
schiedene Optionen können Statusinformationen zu beendeten oder ange-
haltenen Sohnprozessen abgerufen werden. Liegen Statusinformationen
für mehrere Sohnprozesse vor, ist die Reihenfolge, in der sie ausgege-
ben werden, unbestimmt.
Die Funktion wait() stellt die Ausführung des aufrufenden Prozesses so
lange zurück, bis Statusinformationen für einen seiner beendeten Sohn-
prozesse verfügbar sind, oder bis zur Auslieferung eines Signals, das
entweder die Ausführung einer Signalbehandlungsfunktion oder die Been-
digung des Prozesses zur Folge hat. Stehen Statusinformationen bereits
vor dem Aufrufen von wait() zur Verfügung, kehrt die Funktion sofort
zurück.
Die Funktion waitpid() verhält sich genau wie wait(), wenn das Argu-
ment pid gleich (pidt)-1 und das Argument options gleich 0 ist.
Andernfalls wird das Verhalten durch die Werte der Argumente pid und
options bestimmt.
Das Argument pid gibt eine Menge von Sohnprozessen an, für die Status-
informationen angefordert werden. Die Funktion waitpid() gibt nur den
Status eines Sohnprozesses aus dieser Menge zurück.
- Wenn pid gleich (pidt)-1 ist, wird der Status für jeden Sohnprozeß
angefordert. In dieser Hinsicht entspricht waitpid() also der Funk-
tion wait().
- Wenn pid größer als 0 ist, gibt das Argument die Prozeß-ID eines
einzelnen Sohnprozesses an, für den der Status angefordert wird.
- Wenn pid gleich 0 ist, wird der Status für jeden Sohnprozeß ange-
fordert, dessen Prozeßgruppen-ID der des aufrufenden Prozesses ent-
spricht.
- Wenn pid kleiner als (pidt)-1 ist, wird der Status für jeden Sohn-
prozeß angefordert, dessen Prozeßgruppen-ID der des Absolutwerts
von pid entspricht.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
wait(2) wait(2)
Das Argument options wird aus der bitweisen OR-Verknüpfung von null
oder mehr der folgenden Flags gebildet, die in der Include-Datei
<sys/wait.h> definiert sind:
WCONTINUED Die Funktion waitpid() gibt den Status jedes wiede-
raufgenommenen Sohnprozesses zurück, der durch pid
angegeben ist, und dessen Status seit der Wiederauf-
nahme nach einem Anhalten durch die Ablaufsteuerung
noch nicht ausgegegeben wurde.
WNOHANG Die Funktion waitpid() stellt die Ausführung des auf-
rufenden Prozesses nicht zurück, wenn der Status für
einen der durch pid angegebenen Sohnprozesse nicht
sofort verfügbar ist.
WUNTRACED Der Status aller von pid angegebenen Sohnprozesse, die
angehalten wurden und deren Status seither noch nicht
zurückgegeben wurden, wird ebenfalls an den anfordern-
den Prozeß ausgegeben.
Wenn für den aufrufenden Prozeß SANOCLDWAIT gesetzt oder SIGCHLD auf
SIGIGN gesetzt ist, und der Prozeß keine in Zombie-Prozesse umgewan-
delte Sohnprozesse hat, auf die nicht gewartet wird, blockiert er so
lange, bis alle seine Sohnprozesse beendet sind, wait() und waitpid()
schlagen fehl, und errno wird auf ECHILD gesetzt.
Wenn wait() oder waitpid() zurückkehren, weil der Status eines Sohn-
prozesses verfügbar ist, geben diese Funktionen einen der Prozeß-ID
des Sohnprozesses entsprechenden Wert zurück. Ist in diesem Fall der
Wert des Arguments statloc kein Nullzeiger, werden die Informationen
an der Position gespeichert, auf die statloc zeigt. Nur wenn der
zurückgegebene Status von einem beendeten Sohnprozeß stammt, der aus
der Funktion main() den Wert 0 zurückgegeben oder im Argument status
den Wert 0 (Null) an exit() oder exit() übergeben hat, ist der Wert,
der an der Position gespeichert wird, auf die statloc zeigt, gleich
0. Unabhängig vom Wert können diese Informationen mit Hilfe der fol-
genden, in <sys/wait.h> definierten Makros interpretiert und als ganz-
zahlige Ausdrücke ausgewertet werden. Das Argument statval ist der
ganzzahlige Wert, auf den statloc zeigt.
WIFEXITED(statval)
Gibt einen Wert ungleich Null aus, wenn der Status für einen nor-
mal beendeten Sohnprozeß zurückgegeben wurde.
WEXITSTATUS(statval)
Wenn der Wert von WIFEXITED(statval) ungleich Null ist, gibt
dieses Makro die niederwertigsten 8 Bits des Arguments status
aus, das der Sohnprozeß an exit() oder exit() übergeben hat,
oder den Wert, den der Sohnprozeß aus main() zurückgegeben hat.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
wait(2) wait(2)
WIFSIGNALED(statval)
Gibt einen Wert ungleich Null aus, wenn der Status für einen
Sohnprozeß zurückgegeben wurde, der aufgrund eines Signals been-
det wurde, das nicht bearbeitet worden ist [siehe signal(5)].
WTERMSIG(statval)
Wenn der Wert von WIFSIGNALED(statval) ungleich Null ist, gibt
dieses Makro die Nummer des Signals aus, das die Beendigung des
Sohnprozesses verursacht hat.
WIFSTOPPED(statval)
Gibt einen Wert ungleich Null aus, wenn der Status für einen der-
zeit angehaltenen Sohnprozeß zurückgegeben wurde.
WSTOPSIG(statval)
Wenn der Wert von WIFSTOPPED(statval) ungleich Null ist, gibt
dieses Makro die Nummer des Signals aus, durch das der Sohnprozeß
angehalten wurde.
WIFCONTINUED(statval)
Gibt einen Wert ungleich Null aus, wenn der Status für einen
Sohnprozeß zurückgegeben wurde, der nach dem Anhalten durch die
Ablaufsteuerung wiederaufgenommen wurde.
Wenn die Information, auf die statloc zeigt, durch einen Aufruf von
waitpid() gespeichert wurde, der das Flag WUNTRACED aber nicht das
Flag WCONTINUED angegeben hat, gibt nur eines der Makros
WIFEXITED(*statloc), WIFSIGNALED(*statloc) und WIFSTOPPED(*statloc)
einen Wert ungleich Null aus.
Wenn die Information, auf die statloc zeigt, durch einen Aufruf von
waitpid() gespeichert wurde, der die Flags WUNTRACED und WCONTINUED
angegeben hat, gibt nur eines der Makros WIFEXITED(*statloc),
WIFSIGNALED(*statloc), WIFSTOPPED(*statloc) und
WIFCONTINUED(*statloc) einen Wert ungleich Null aus.
Wenn die Information, auf die statloc zeigt, durch einen Aufruf von
waitpid() gespeichert wurde, der keines der Flags WUNTRACED oder
WCONTINUED angegeben hat, oder durch einen Aufruf der Funktion wait(),
gibt nur eines der Makros WIFEXITED(*statloc) und
WIFSIGNALED(*statloc) einen Wert ungleich Null aus.
Wenn die Information, auf die statloc zeigt, durch einen Aufruf von
waitpid() gespeichert wurde, der nicht das Flag WUNTRACED, aber das
Flag WCONTINUED angegeben hat, oder durch einen Aufruf der Funktion
wait(), gibt nur eines der Makros WIFEXITED(*statloc),
WIFSIGNALED(*statloc) und WIFCONTINUED(*statloc) einen Wert ungleich
Null aus.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
wait(2) wait(2)
Es können weitere implementierungsspezifische Bedingungen vorliegen,
unter denen wait() oder waitpid() Statusinformationen zurückgeben.
Dies geschieht jedoch nur, wenn der aufrufende Prozeß oder einer sei-
ner Sohnprozesse expliziten Gebrauch von einer nichtstandardmäßigen
Erweiterung macht. In diesen Fällen ist die Interpretation des zurück-
gegebenen Status von der jeweiligen Implementierung abhängig.
Wenn ein Vaterprozeß beendet wird, ohne auf die Beendigung aller sei-
ner Sohnprozesse zu warten, wird den noch verbleibenden Sohnprozessen
eine neue Vaterprozeß-ID zugeordnet, die einem von der Implementierung
abhängigen Systemprozeß entspricht.
RÜCKGABEWERT
Wenn wait() oder waitpid() zurückkehren, weil der Status eines Sohn-
prozesses verfügbar ist, geben diese Funktionen einen Wert zurück, der
der Prozeß-ID des Sohnprozesses entspricht, für den der Status zurück-
gegeben wurde. Kehren wait() oder waitpid() aufgrund der Auslieferung
eines Signals an den aufrufenden Prozeß zurück, wird -1 zurückgegeben
und errno auf EINTR gesetzt. Wird waitpid() mit gesetztem Flag WNOHANG
im Argument options aufgerufen, ist zumindest ein durch pid angegebe-
ner Sohnprozeß vorhanden, für den kein Status verfügbar ist, und wenn
für keinen der durch pid angegebenen Prozesse ein Status verfügbar
ist, wird 0 zurückgegeben. Andernfalls wird (pidt)-1 zurückgegeben
und errno zur Anzeige des Fehlers gesetzt.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
Die Funktion wait() schlägt bei folgenden Bedingungen fehl:
ECHILD Der aufrufende Prozeß hat keine vorhandenen Sohnprozesse,
auf die nicht gewartet wird.
EINTR Die Funktion wurde von einem Signal unterbrochen. Der Wert
der Position, auf die statloc zeigt, ist nicht definiert.
Die Funktion waitpid() kann bei folgenden Bedingungen fehlschlagen:
ECHILD Der durch pid angegebene Prozeß oder die Prozeßgruppe ist
nicht vorhanden oder ist kein Sohnprozeß des aufrufenden
Prozesses.
EINTR Die Funktion wurde von einem Signal unterbrochen. Der Wert
der Position, auf die statloc zeigt, ist nicht definiert.
EINVAL Das Argument options ist ungültig.
SIEHE AUCH
exec(2), exit(2), fork(2), pause(2), ptrace(2), signal(2), waitid(2),
wait3(3), signal(5), types(5), wait(5), wstat(5).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98