2010-12-11 9 views
5

dies ist ein bis zu How to squeeze in additional parameters to a reaper function when a parent is signalled to kill a child (c)?wait()/waitpid() gibt 1, nicht pid des Kindes, wie man das beheben?

In meinem Reaper folgen(), ich versuche das Kind pid die Eltern zu erhalten, ist über (nicht brutal Wort hier) zu beenden. aber wait() gibt die PID des Kindes nicht zurück; Stattdessen gibt es 1 zurück. Ich kann nirgends ein Dokument für den Rückgabewert 1 finden. Irgendwelche Köpfe?

void reaper(int sig) 
{ 
    int status, killedpid; 

    while(killedpid = (/*waitpid(-1, &status, WNOHANG)*/wait(&status)) >= 0) 
    { 
     printf("reaper %d killed %d\n", getpid(), killedpid); 
    } 
} 

Meine Ergebnisse:

reaper 5933 killed 1 //actual child pid is 5936 

Vielen Dank im Voraus!

+0

Oh, ich sage weiter mit der Terminologie. Das gehört zum Spaß von * nix. "Das Kind starb, und die Eltern ernteten den Zombie-Prozess." – Thanatos

Antwort

13

Dies ist die klassische Zuordnung in bedingten Fehlern - der Ausdruck ausgewertet werden wie folgt (da Vergleich höher hat precedence dann Zuordnung):

if (killedpid = (wait(&status) >= 0)) { ... 

Die killedpid einen Wert von TRUE erhalten wird, das ist 1 in C um diese Verwendung Klammer zu erhalten und kompilieren mit hohen Warnstufen wie -Wall -pedantic:

if ((killedpid = wait(...)) >= 0) { ... 
+0

Vielen Dank für Ihren Einblick! –

+0

Das Gleiche gilt für PHP. Ich benutzte 'pcntl_waitpid()' und hatte denselben Fehler, der dazu führte, dass der Rückgabewert immer als '1' angezeigt wurde. – Marki555