Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

wait, waitpid - auf Halt oder Ende eines Kindprozesses warten

&pagelevel(4)&pagelevel

Definition

#include <sys/wait.h>

Optional
#include <sys/types.h> (Ende)

pid_t wait (int *stat_loc);
pid_t waitpid (pid_t pid, int *stat_loc, int options);

Beschreibung

wait() und waitpid() erlauben es dem aufrufenden Prozess, den Status eines seiner Kindprozesse zu ermitteln. Wenn der Status für zwei oder mehr Kindprozesse verfügbar ist, ist die Reihenfolge, in der diese Informationen geliefert werden, undefiniert.

wait() unterbricht die Ausführung des aufrufenden Prozesses, bis der Endestatus für einen Kindprozess verfügbar ist, oder bis zur Zustellung eines Signals, dessen Signalaktion entweder die Ausführung einer Signalbehandlungsfunktion oder SIG_DFL ist. Wenn der Status bereits vor dem Aufruf von wait() verfügbar ist, erfolgt eine sofortige Rückkehr von wait().

waitpid() verhält sich identisch zu wait(), wenn pid den Wert (pid_t)-1 und options den Wert 0 hat. Andernfalls wird das Verhalten von waitpid() durch die Werte der Argumente pid und options verändert.

pid gibt eine Menge von Kindprozessen an, für die der Status ermittelt werden soll.waitpid() liefert nur den Status eines Kindprozesses aus dieser Menge zurück:

  • Wenn pid gleich (pid_t)-1 ist, wird der Status irgendeines Kindprozesses abgefragt. In dieser Hinsicht ist waitpid() dann äquivalent zu wait().

  • Wenn pid größer als 0 ist, gibt dieses Argument die Prozessnummer eines einzelnen Kindprozesses an, für den der Status abgefragt wird.

  • Wenn pid gleich 0 ist, wird der Status für irgendeinen Kindprozess abgefragt, dessen Prozessgruppennummer gleich der des aufrufenden Prozesses ist.

  • Wenn pid kleiner als (pid_t)-1 ist, wird der Status irgendeines Kindprozesses abgefragt, dessen Prozessgruppennnumer gleich der des Absolutbetrags von pid ist.

options wird durch die bitweise inklusive Oder-Verknüpfung mit einem der folgenden Flags gebildet, die in der Include-Datei sys/wait.h definiert sind.

WCONTINUED

waitpid() ermittelt den Status für einen durch pid angegebenen, fortgesetzten Kindprozess, dessen Status noch nicht abgefragt wurde, seit er nach einem Job Control Stop fortgesetzt wurde.

WNOHANG

waitpid() hält die Ausführung des aufrufenden Prozesses nicht an, wenn der Status für einen der durch pid angegebenen Kindprozesse nicht unmittelbar verfügbar ist.

WUNTRACED

Der Status aller durch pid angegebenen Prozesse, die angehalten wurden und deren Status seit dem Anhalten noch nicht geliefert wurde, wird ebenfalls an den aufrufenden Prozess gemeldet.

Wenn wait() oder waitpid() zurückkehren, weil der Status eines Kindprozesses verfügbar ist, ist der Returnwert dieser Funktionen gleich der Kindprozessnummer. Wenn dann der Wert von stat_loc nicht der Nullzeiger ist, wird der Status an der Stelle abgelegt, auf die stat_loc zeigt.

Wenn der Endestatus eines Kindprozess geliefert wird, der den Wert 0 aus main() zurückgegeben oder der den Wert 0 als Argument an _exit() oder exit() übergeben hat, ist auch der Wert, der an der Adresse stat_loc abgelegt wird, gleich 0. Gleichgültig, welchen Wert diese Information hat, sie kann mit Hilfe der folgenden Makros interpretiert werden, die in sys/wait.h definiert sind und die ganzzahlige Ausdrücke berechnen; stat_val ist ein ganzzahliger Wert, auf den stat_loc zeigt.

WIFEXITED( stat_val )

Berechnet einen Wert ungleich 0 (wahr in C), wenn der Status für einen Kindprozess geliefert wurde, der sich normal beendet hat.

WEXITSTATUS( stat_val )

Wenn der Wert von WIFEXITED( stat_val ) ungleich 0 ist, berechnet dieses Makro die niederwertigen 8 Bit des Endestatus, den der Kindprozess an _exit() oder exit() übergeben hat, bzw. des Werts, den der Kindprozess aus main() zurückgegeben hat.

WIFSIGNALED( stat_val )

Berechnet einen Wert ungleich 0, wenn der Status für einen Kindprozess geliefert wurde, der sich durch den Empfang eines Signals beendete, das nicht abgefangen wurde (siehe auch signal.h).

WTERMSIG( stat_val )

Wenn der Wert von WIFSIGNALED( stat_val ) ungleich 0 ist, berechnet dieses Makro die Signalnummer, die den Abbruch des Kindprozesses verursacht hat.

WIFSTOPPED( stat_val )

Berechnet einen Wert ungleich 0, wenn der Status für einen Kindprozess geliefert wurde, der zurzeit angehalten ist.

WSTOPSIG( stat_val )

Wenn der Wert von WIFSTOPPED( stat_val ) ungleich 0 ist, berechnet dieses Makro die Nummer des Signals, das den Kindprozess angehalten hat.

WIFCONTINUED( stat_val )

Berechnet einen Wert ungleich 0, wenn der Status für einen Kindprozess geliefert wurde, der nach einem Job Control Stop fortgesetzt wurde.

Wenn der Status, der an der Stelle stat_loc abgelegt ist, dort von einem Aufruf von wwaitpid() abgelegt wurde, der

  • das Flag WUNTRACED , nicht aber das Flag WCONTINUED angegeben hatte, liefert genau eines der Makros WIFEXITED(*stat_loc ), WIFSIGNALED(*stat_loc ) oder WIFSTOPPED(*stat_loc ) einen Wert ungleich 0.

  • die Flags WUNTRACED und WCONTINUED angegeben hatte, liefert genau eines der Makros WIFEXITED(*stat_loc ), WIFSIGNALED(*stat_loc ) und WIFSTOPPED(*stat_loc ) und WIFCONTINUED(*stat_loc ) einen Wert ungleich 0.

  • weder das Flag WUNTRACED noch das Flag WCONTINUED angegeben hatte, oder von einem Aufruf der Funktion wait() abgelegt wurde, liefert genau eines der Makros WIFEXITED(*stat_loc ) und WIFSIGNALED(*stat_loc ) einen Wert ungleich 0.

  • das Flag WCONTINUED, nicht aber das Flag WUNTRACED angegeben hatte, oder von einem Aufruf der Funktion wait(), liefert genau eines der Makros WIFEXITED(*stat_loc ), WIFSIGNALED(*stat_loc ) und WIFCONTINUED(*stat_loc ) einen Wert ungleich 0.

Wenn sich ein Vaterprozess beendet, ohne auf alle seine Kindprozesse zu warten, wird den verbleibenden Kindprozessen eine neue Vaterprozessnummer zugeordnet, nämlich die des Systemprozesses init.

Werden Threads verwendet, so wirken sich die Funktionen wait() und waitpid() auf den Prozess oder auf einen Thread wie folgt: Der rufende Thread wird suspendiert, bis die Statusinformation verfügbar ist.

Returnwert

Kindprozessnummer



wenn wait() oder waitpid() zurückkehren, weil der Status eines Kindprozesses verfügbar ist.


-1

wenn wait() oder waitpid() auf Grund der Zustellung eines Signals zurückkehren. errno wird auf EINTR gesetzt.


0

wenn waitpid() mit dem Flag WNOHANG im Argument options aufgerufen wurde und die Funktion mindestens einen Kindprozess durch pid angegeben hat.


(pid_t)-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

wait() schlägt fehl, wenn gilt: 

 

ECHILD

Der aufrufende Prozess besitzt keine Kindprozessse, auf die nicht gewartet wird.

 

EINTR

Die Funktion wurde von einem Signal unterbrochen. Der Wert des Objekts, auf das stat_loc zeigt, ist dann undefiniert.

 

waitpid() schlägt fehl, wenn gilt: 

 

ECHILD

Der mit pid angegebene Prozess oder die Prozessgruppe existiert nicht, oder er ist kein Kindprozess des aufrufenden Prozesses.

 

EINTR

Die Funktion wurde von einem Signal unterbrochen. Der Wert des Objekts, auf das stat_loc zeigt, ist dann undefiniert.

 

EINVAL

options ist nicht gültig.

Siehe auch

exec, exit(), fork(), sys/types.h, sys/wait.h.