2009-04-16 3 views
0

J'utilise posix_spawnp pour générer des processus enfants à partir de mon processus principal.Les processus engendrés sont abandonnés

int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ); 

    if (iRet != 0) 
    {  
     return false; 
    } 

Parfois, après qu'un processus fils est créé sans erreur, il devient soudainement défunt. Comment cela pourrait-il se produire?

-je utiliser un gestionnaire de signaux pour récolter des processus enfants:

void SigCatcher(int n) 
{  
    while(waitpid(-1, NULL, WNOHANG) > 0);   
} 

et j'appeler manuellement chaque fois que je tue un processus enfant.

kill(oProcID, SIGKILL); 

    signal (SIGCHLD, SigCatcher); 

Est-ce que cela pourrait engendrer que les enfants fassent défunt (sans que j'appelle kill)?

Répondre

2

Ce:

kill(oProcID, SIGKILL); 

signal (SIGCHLD, SigCatcher); 

ressemble à un race condition. Vous devez installer le gestionnaire de signal avant de tuer le processus fils, sinon vous risquez de manquer le signal.

+0

Merci. J'ai implémenté le gestionnaire de signal dans une bibliothèque partagée. Il n'est pas enregistré si je mets "signal (SIGCHLD, SigCatcher)" dans le constructeur. Est-ce que cela doit aller dans le main()? – Gayan

+0

@Gayan: c'est probablement tout simplement si vous configurez les gestionnaires de signal comme l'une des premières choses que fait l'application dans main. –

+0

le fait qu'il soit dans un constructeur ne devrait pas importer. mais il devrait être dans le principal de toute façon (voir ma réponse) – Alnitak

1

Avez-vous appelé:

signal(SIGCHLD, SigCatcher); 

nulle part ailleurs? Si ce n'est pas le cas, vous devez le faire avant que les processus fils ne soient générés pour s'assurer que ces enfants sont récoltés lorsqu'ils se terminent. Comme Unwind le signale, vos appels en cours vers kill et signal sont erronés.

utilisation typique serait:

signal(SIGCHLD, handler); 
posix_spawnp(...); 
... 
// do other stuff 
... 
kill(pid, SIGKILL); 
Questions connexes