2009-10-29 4 views
7

Wenn ich auf eine bestimmte laufende Prozessgruppe warte, die ein untergeordneter Prozess ist, gibt WIFEXITED den Wert "true" zurück und sagt, dass der Prozess beendet wurde? Funktioniert das so? Es scheint, gibt es etwas, was ich nicht bin zu verstehen ....Warum wurde WIFEXITED beim Ausführen des Prozesses als wahr zurückgegeben?

if (waitpid(-pgid, &pstatus, WUNTRACED|WNOHANG) == -1) 
    perror("Wait error"); 

if (WIFEXITED(pstatus)) { 
    strncpy(buf, "Exited", buf_size); 
    return 0; 

Antwort

6

Wie Sie WNOHANG angegeben denke ich waitpid0 und pstatus zurückkehrt den Wert hat es vor so WIFEXITED hatte nicht mit aktualisierter Daten arbeiten.

wenn WNOHANG angegeben wurde und ein oder mehr Kind (ern) von pid angegebenen existieren, aber noch nicht veränderten Zustand, dann 0 zurückgegeben.

+0

Ah, ich habe neu initialisieren auf 0, aber jetzt irgendwie verstehe ich. aber ich verstehe nicht ganz, wie ich sagen kann, ob etwas noch läuft oder ob es ausgeht (ohne zu blockieren). –

+0

Wenn eines Ihrer Kinder den Status geändert hat (gestorben), wird waitpid eine positive Zahl zurückgeben. –

+0

Oh, ich verstehe jetzt ... Ich muss sowohl den Rückgabewert und den Statuswert nehmen, um den Status des Prozesses zu erhalten. (Rückgabewert ist nicht nur für Fehler oder nicht). Vielen Dank! –

1

waitpid gibt die abgeerntete untergeordnete PID zurück, wenn sie erfolgreich ein Kind erntet. Bei Verwendung mit WNOHANG wird sofort 0 zurückgegeben, wenn keine Kinder ausgetreten sind. Daher müssen Sie überprüfen, ob der Rückgabewert 0 oder eine PID vor der Überprüfung status ist. Sehen Sie hier für weitere Details:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/waitpid.html

Verwandte Themen