Question

comment puis-je obtenir des informations sur l'état d'un processus (c'est-à-dire s'il s'agit d'un zombie) à l'aide de C sous Linux?

Après avoir lu les réponses jusqu’à présent, je voudrais préciser un peu ma question: je préférerais une solution en C pur. Après avoir lu la source ps (qui lit / proc /), j’ai pensé qu’il devrait y avoir un meilleur moyen et je l’ai demandé ici:)

Était-ce utile?

La solution

Vous voudrez en savoir plus sur l’interaction avec le système de fichiers / proc / "psuedo". via les appels typiques de la bibliothèque standard C. La documentation nécessaire à la mise en route est fournie avec n’importe quelle distribution Linux et se trouve à une simple recherche google.

(Maintenant que vous savez quoi chercher. Je sais que c'est généralement le défi à relever!)

En bref, les répertoires et les fichiers du répertoire / proc / d’un système Linux en cours d’exécution reflètent l’état du noyau en cours d’exécution, ce qui inclut (naturellement) les processus. Cependant, avant de facturer, vous devez garder certaines informations à l'esprit.

Un processus zombie n’est pas la même chose qu’un processus orphelin. Un processus orphelin est un processus en cours d'exécution dans un état d'attente après la fermeture incorrecte du processus parent. Un processus zombie est un processus qui s'est terminé correctement, libère toutes ses ressources, mais conserve une place dans la table des processus.

Cela se produit généralement lorsqu'un processus est lancé par un programme. Vous voyez, le noyau ne supprimera pas l'entrée d'un sous-processus terminé dans la table de processus jusqu'à ce que le programme parent récupère correctement l'état de retour du sous-processus. Ça a du sens; sinon, comment le programme parent pourrait-il savoir si le sous-processus s'est arrêté de manière incorrecte?

Donc, tous les sous-processus sont techniquement des zombies pendant au moins une très courte période. Ce n’est pas en soi un mauvais état pour un programme.

En effet, "zombies" sont parfois créés intentionnellement. Par exemple, un programme laisse parfois une entrée zombie en place de sorte que les processus lancés ultérieurement ne reçoivent pas le même PID que le processus précédemment lancé (et maintenant zombie).

En d’autres termes, si vous tentez inutilement de capturer des processus zombies, vous risquez de créer un problème sérieux pour le programme de génération. Cependant, si un processus est un zombie depuis une demi-heure ou plus, c'est probablement le signe d'un bug.

Edit: La question a changé sur moi! Non, il n'y a pas de moyen plus simple que comment ps le fait. Si c'était le cas, il aurait été intégré à ps il y a longtemps. Les fichiers / proc sont la source be-all-end-all pour des informations sur l'état du noyau. :)

Autres conseils

Je ne connais que deux façons:

  • Analyse de la sortie de la commande ps
  • Lecture de fichiers dans / proc / PID, où PID est l'identificateur du processus (c'est ce que ps fait en interne)

Vous souhaitez que les processus s'exécutant sur votre ordinateur utilisent ensuite

$ ps aux

ps affiche des informations sur une sélection de processus actifs. Si vous souhaitez une mise à jour répétitive de la sélection et des informations affichées, utilisez plutôt le haut .

ici trouvé:

Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Ceci pourrait être facilement analysé à l'aide de C.

Le pseudo système de fichiers / proc décrit les structures de données internes du noyau et vous permet de modifier directement certaines valeurs. L'obtention de l'état d'un processus particulier peut être facilement mise en œuvre avec les fonctions I / O C. Le fichier à analyser est le suivant: / proc / {PID} / status

La commande ci-dessous peut être utilisée pour obtenir des processus dans l'état Zombie.

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top