6
votes

Processus Zombie Supprimer sans attendre c

J'ai un processus enfant qui juste sortie (0) . C'est devenu zombie. Y a-t-il un moyen de le supprimer sans attendre ou waiterpid dans le processus parent? xxx


5 commentaires

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 ou waiterpid ?


Parce que attendre 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 ?


@Michaeldorgan Cela pourrait être étiqueté c, car la réponse devrait inclure le code C ...


3 Réponses :


7
votes

Vous pouvez attraper le signal sigchld (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 Signal-Safety (7) . Une bonne chose à faire à l'intérieur d'un gestionnaire de signal est de définir un drapeau volatile sigatomic_t (que vous testeriez plus tard, extérieur du gestionnaire de signal, par exemple dans certains boucle d'événement ). Ou vous pouvez, au moment de l'initialisation, configurez un tuyau (7) (à 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 .

et WaiterPID (2) peut être dit de Ne pas arrêter avec wnohang

Si vous n'attendez jamais votre processus enfant, il deviendra Zombie .

lire Programmation Linux avancée . Il a un bon chapitre sur les processus.


0 commentaires

6
votes

Le plus simple est de rendre Sigchld ignoré dans le parent:

signal(SIGCHLD, SIG_IGN);


4 commentaires

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 waiterpid même en ignorant le signal sigchld , de sorte que le noyau doit donc zombifier le processus d'enfants (mais je peux me tromper, car je n'ai pas fait test que).


@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 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 ...



2
votes

Vous pouvez utiliser le double Fourchette Technique:

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 init . Le processus init attendra automatiquement le processus enfant enfant lorsqu'il est sorti.

Ceci ne supprime pas waiterpid , 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 du parent sans blocage long.

voir Cet article pour Plus d'informations.


0 commentaires