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