J'ai un processus enfant qui juste sortie (0) code>. C'est devenu zombie. Y a-t-il un moyen de le supprimer sans attendre code> ou waiterpid code> dans le processus parent?
3 Réponses :
Vous pouvez attraper le signal et WaiterPID (2) peut être dit de Ne pas arrêter avec Si vous n'attendez jamais votre processus enfant, il deviendra Zombie . P >
lire Programmation Linux avancée . Il a un bon chapitre sur les processus. P> sigchld code> (par exemple, en utilisant Sigaction (2) etc ...). Soyez prudent, très peu de fonctions sont appelables en toute sécurité à partir d'un gestionnaire de signal. Lisez plusieurs fois signal (7) et volatile sigatomic_t code> (que vous testeriez plus tard, extérieur em> du gestionnaire de signal, par exemple dans certains boucle d'événement ). Ou vous pouvez, au moment de l'initialisation, configurez un tuyau (7) a> (à votre propre processus) et écrivez quelques octets sur votre gestionnaire de signal (et Sondage (2) L'extrémité de lecture ailleurs), comme suggéré par qt . p>
wnohang code> p>
Le plus simple est de rendre Sigchld ignoré dans le parent:
signal(SIGCHLD, SIG_IGN);
Les enfants ne deviendraient-ils pas disparus (sans être zombies) uniquement lorsque le processus parent se ferme? En d'autres termes, ne sont-ils pas des zombies jusqu'à ce que le parent quitte? J'imagine que le parent pourrait encore
@BasileSelaTaryNkebitch a ajouté un paragraphe et un lien explique davantage. Mais quand cela fonctionne, alors le processus d'enfant excité / terminé disparaît vraiment, pas de zombie, impossible d'attendre.
Mais le processus d'enfant disparaît-il immédiatement ou seulement lorsque le processus parent se ferme?
@BasileSelaTaryNkevitch pas à 100% sûr que si c'est immédiatement i> ou s'il existe un retard (peut même être différent dans différents systèmes d'exploitation de soutien), mais cela disparaîtra rapidement sans être une fuite de ressources et ne dépendra pas sur la sortie des parents. Il n'y aurait pas beaucoup de point dans l'ensemble du mécanisme, sinon ...
Vous pouvez utiliser le double Créer un processus enfant enfant. Et mettre fin au processus d'enfant immédiatement après cela.
De cette manière, le processus enfant enfant ira sous le processus Ceci ne supprime pas voir Cet article pour Plus d'informations. P> Fourchette Code> Technique: P>
init code>. Le processus init code> attendra automatiquement le processus enfant enfant lorsqu'il est sorti. P>
waiterpid code>, car le parent doit attendre la fin du processus d'enfant.
Parce que la durée de vie du processus d'enfant est toujours minimale, vous pouvez appeler waiterpid code> du parent sans blocage long. P>
Je ne sais pas comment c'est un post C. Peut-être parce que UNIX a été créé en C? :)
Pourquoi ne voulez-vous pas utiliser
attendre code> ouwaiterpid code>?Parce que
attendre code> arrêtera le processus parent, jusqu'à la sortie de l'enfant.peut-être exister le moyen de gérer le parent sans arrêter avec
attendre code>?@Michaeldorgan Cela pourrait être étiqueté c, car la réponse devrait inclure le code C ...