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.