En las profesiones serias... esto no pasa.

  1. #39   #13 Creo que te confundes tú. El proceso huérfano es aquel en que su padre ha muerto antes que él. Sin embargo el zombie es aquel que ha muerto, y no se ha leido su información de estado de finalización.

    Si te creas un programa que cree un hijo ,y muere el hijo, y luego muere el padre, si haces ps -aux verás que efectivamente ambos se han borrado de la tabla de procesos. El propio kernel se encarga dequitarlos de la tabla de procesos.

    Ahora piensa en un programa un poquito más complejo. Pongamos un árbol de unos 25 procesos hijos, cada uno ejecutando una tarea, y el padre gestionando la comunicación entre ellos. Si uno de los hijos muere, si observas la tabla de procesos (ps -aux nuevamente), verás que el que ha muerto tiene el indicativo Z . Se ha quedado, efectivamente zombie. Y así se quedará hasta que muera el padre, o hasta que se lea su información de finalización.

    Por supuesto pongamos un sistema en tiempo real crítico; El padre no puede ser terminado bajo ningún concepto, por lo tanto tienes que limpiar los procesos que has terminado. No hacerlo se considera un fallo en el programa, una mala costumbre, y además una chapuza propia de no haber entendido un carajo en clases de SSOO.

    Es posible que en el código haya cosas innecesarias. Modifiquémoslo:

    int main(int argc, char **argv)
    {
    int status;
    pid_t PID_Hijo;
    PID_Hijo=fork();
    if(!PID_Hijo) exit(0);
    else{
    sleep(50000);
    waitpid(PID_Hijo,&status,WNOHANG);
    }

    return 1;
    }

    Ejecuta, y mientras dura el sleep, comprueba en otra consola la tabla de procesos; verás un maravilloso ZOMBIE.

    Y luego me cuentas.... ;)
    22  votos: 3   link
    el 10-05-2007 14:20 UTC por kaster kaster
     twitter  facebook  tuenti  
comentarios cerrados

menéame