Question

J'ai le PID d'un processus et je dois vérifier s'il s'agit d'un zombie utilisant les appels système POSIX en C. Comment dois-je faire cela?

Le problème que j’ai, c’est que j’ai un processus qui englobe de nombreux enfants. Tous les enfants exercent des fonctions d’exécutif et, parfois, je veux faire l’exécutif en arrière-plan afin que je ne puisse pas vraiment attendre () les enfants qui vont. en arrière-plan. Je pourrais attendre () périodiquement (une fois dans ma boucle principale), mais je dois savoir quels processus sont zombies afin que mon père ne se bloque pas en attendant des enfants qui ne vont pas finir bientôt.

Si vous êtes curieux, je construis un shell Unix et il est normal que les processus enfants se comportent de manière asynchrone.

Était-ce utile?

La solution

Vous ne pouvez pas vérifier si un processus est un zombie avec des appels POSIX purs - sauf si vous êtes le processus parent, et le récolter avec un famille wait . Vous devrez donc trouver un bon endroit pour attendre l'enfant.

Une option consiste à définir un gestionnaire SIGCHLD et à y faire un waitpid (0, & status, WNOHANG) . Assurez-vous de boucler jusqu'à ce qu'il ne trouve plus aucun processus - si deux enfants meurent dans un intervalle court, vous ne pouvez obtenir qu'un seul SIGCHLD .

Une autre option est de doubler fork - c'est-à-dire fork () , demandez à l'enfant (appelez-le enfant A) de nouveau fork, créez le deuxième enfant (enfant B). L'enfant A quitte alors immédiatement. Pendant ce temps, le parent est wait () pour l'enfant A. Une fois que l'enfant A est parti, le processus init du système s'occupe de récolter l'enfant B quand il mourra. Cette méthode est plus simple, mais votre shell n'aura aucun moyen de savoir quand l'enfant B mourra. Si vous avez besoin de ces informations, utilisez l'ancienne méthode.

Autres conseils

Mais… mais… le zombie est un enfant (à un certain niveau) et le processus à vérifier est un parent, non? Donc, si vous pensez qu'un pid spécifique est un zombie, pourquoi ne pas simplement faire un waitpid (2) avec WNOHANG et vous en débarrasser? Désormais, cela consommera le statut de sortie. Il peut donc être une mauvaise idée si un autre processus souhaite vraiment attendre à l'avenir.

Vous dites que vous construisez un shell Unix; Vous devriez lire ceci: Traitement approprié de SIGINT / SIGQUIT

Normalement, le shell vérifie la présence d'enfants disparus peu de temps avant d'imprimer son invite - à l'aide de l'appel système waitpid (2) et de l'option WNOHANG comme indiqué précédemment. Vous voudrez peut-être aussi un gestionnaire SIGCHLD - mais vous devrez décider de ce que vous allez faire avec les informations si vous êtes occupé à attendre la fin d'un processus de premier plan et qu'il s'agit en réalité d'un processus d'arrière-plan qui se termine.

Il ne s'agit que d'une variation mineure de la réponse actuellement sélectionnée.

Et que dire de la commande shell "ps" qui vous montre la table des processus actifs où vous pouvez trouver qu'un processus est "obsolète"? Je suppose qu’il doit y avoir un moyen d’obtenir cette information à partir du code c.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top