2010-12-11 21 views
5

esto es una continuación de How to squeeze in additional parameters to a reaper function when a parent is signalled to kill a child (c)?wait()/waitpid() devuelve 1, no pid de hijo, ¿cómo solucionarlo?

En mi segador(), trato de obtener el PID hijo de los padres está a punto de terminar (la palabra no brutal aquí). pero wait() no devuelve el pid del niño; en su lugar, devuelve 1. No puedo encontrar un documento para el valor de devolución de 1 en cualquier lugar. ¿Algún aviso?

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

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

Mis resultados:

reaper 5933 killed 1 //actual child pid is 5936 

gracias de antemano!

+0

Oh, digo seguir con la terminología. Eso es parte de la diversión de * nix. "El niño murió y el padre cosechó el proceso zombie". – Thanatos

Respuesta

13

Este es el clásico asignación en error condicional - la expresión se evalúa de la siguiente manera (porque la comparación tiene mayor precedence luego asignación):

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

El killedpid obtendrá un valor de TRUE, que es 1 en C. Para evitar este uso paréntesis y compilar con altos niveles de advertencia como -Wall -pedantic:

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

¡Muchas gracias por su visión! –

+0

Lo mismo se aplica a PHP. Usé 'pcntl_waitpid()' y tuve el mismo error haciendo que el valor de retorno siempre aparezca como '1'. – Marki555

Cuestiones relacionadas