CUESTIÓN
Al ejecutar este programa:
[...]
int resultado;
pid_t pid;
[...]
sleep(5);
pid=getpid();
if((waitpid(pid, &resultado, WNOHANG)) == -1){
perror("wait");
return 1;
}
me da el siguiente error:
wait:no child proccess
No lo entiendo porque he hecho un fork()
antes y ya he tomado la precaución de esperar cinco
segundos para que al hijo le dé tiempo a nacer.
SOLUCIÓN
Este código contiene dos problemas, uno menos grave que es lo que
provoca que falle y otro grave.
El menos grave es que la llamada al sistema waitpid
admite como primer parámetro el pid
del hijo por
cuya muerte queremos esperar. Si ponemos nuestro propio pid
estamos pidiendo al sistema operativo esperar por nuestra propia
muerte, lo que es absurdo y el sistema nos dice que "nosotros no
somos nuestro propio hijo".
El problema grave es que estamos usando la llamada
al sistema no bloqueante. ¿Qué ocurre si, por azares
de la distribución de la CPU o por un hecho imprevisible, al hijo que
hemos creado no le ha dado tiempo a terminar en cinco segundos? Pues
que no podremos recoger su código y la llamada fallará innecesariamente.
Como primera solución podéis plantear aumentar el tiempo de espera.
Cuanto más lo aumentéis más improbable será que al hijo no le haya
dado tiempo a terminar, pero la probabilidad nunca será nula.
Por lo tanto, y como además existe una forma de hacer bien las cosas,
usad la versión bloqueante de waitpid
.
© 2003 Guillermo González Talaván.