SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: adocrates en Martes 12 de Octubre de 2004, 18:55

Título: Re: Procesos Defunct
Publicado por: adocrates en Martes 12 de Octubre de 2004, 18:55
Tengo un inconveniente, estoy desarrollando un demonio en Unix que ejecuta en background un programa administrador de colas de procesos, el cual ante algun cambio de estado en la BD ejecuta en background programas asociados que distribuyen y procesan los datos de la BD :

Para ello, utilizo system() y del shell nohup (para independizar del proceso padre) y & (para demonizar el proceso que se ejecuta) :

prg demonio()
       ... otras cosas
       system("nohup administradordecolas > administradordecolas.out 2>&1 &");
       ... demas cosas

prg administradordecolas()
       ...
       if(estado == 1)
          system("nohup programaasociado  > programaasociado.out 2>&1 &");
       ...

PERO, quedan procesos defunct (zombies), que por lo que entiendo, quedan asi porque el proceso padre llamador se muere antes que el hijo.

Modifique el programa, cambie el system() por fork() y execvp() y mas encima agregue signal(SIGCLD, wait_on_child); que se supone que espera el proceso hijo y lo termina adecuadamente :

wait_on_child()
{
   int status;
   while( wait3(&status, WNOHANG, (struct rusage *) 0) > 0 ) ;
}

Lamentablemente, el problema persiste.

Agradeceria alguna informacion para resolver esto.   Gracias.
Título: Re: Procesos Defunct
Publicado por: adocrates en Jueves 14 de Octubre de 2004, 21:22
Lo resolvi !!!

En vez de system(cmd), puse este codigo :

Código: Text
  1.  
  2. signal(SIGCHLD, SIG_IGN);
  3. signal(SA_NOCLDWAIT, SIG_IGN);
  4. if( (ppid = fork()) == -1 ) { return(-1); }
  5. else if( ppid == 0 )
  6. {
  7.   status=execlp(cmd, cmd, NULL);
  8.   sleep(1);
  9.   exit(0);
  10. }
  11. do
  12. {
  13.   wpid = wait(&status);
  14. } while( wpid != -1 && wpid != ppid );
  15. signal(SIGCHLD, SIG_DFL);
  16. signal(SA_NOCLDWAIT, SIG_DFL);
  17.  
  18.