• Viernes 8 de Noviembre de 2024, 14:25

Autor Tema:  Re: Procesos Defunct  (Leído 2372 veces)

adocrates

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
Re: Procesos Defunct
« en: Martes 12 de Octubre de 2004, 18:55 »
0
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.
Solo C que nada C.

adocrates

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
Re: Procesos Defunct
« Respuesta #1 en: Jueves 14 de Octubre de 2004, 21:22 »
0
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.  
Solo C que nada C.