2010-12-11 14 views
5

questo è un follow-up a How to squeeze in additional parameters to a reaper function when a parent is signalled to kill a child (c)?wait()/waitpid() restituisce 1, non pid di child, come risolverlo?

Nel mio Reaper(), cerco di ottenere il figlio di PID il genitore sta per finire (parola non brutale qui). ma aspetta() non restituisce il pid del bambino; restituisce invece 1. Non riesco a trovare un documento per il valore restituito di 1 in qualsiasi luogo. Qualche testa a testa?

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

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

I miei risultati:

reaper 5933 killed 1 //actual child pid is 5936 

Grazie in anticipo!

+0

Oh, dico di andare avanti con la terminologia. Fa parte del divertimento di * nix. "Il bambino è morto e il genitore ha raccolto il processo degli zombi". – Thanatos

risposta

13

Questo è il classico assegnazione in condizionale errore - l'espressione viene valutata come segue (in quanto il confronto ha una maggiore precedence allora assegnazione):

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

Il killedpid otterrà un valore TRUE, che è 1 in C. Per ovviare a questo uso parentesi e compilare con alti livelli di avvertimento come -Wall -pedantic:

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

Grazie mille per l'intuizione! –

+0

Lo stesso vale per PHP. Ho usato 'pcntl_waitpid()' e ho avuto lo stesso errore facendo apparire il valore di ritorno sempre come '1'. – Marki555