2009-03-11 10 views
2

Comment puis-je obtenir des informations sur l'état d'un processus (c'est-à-dire s'il s'agit d'un zombie) en utilisant C sous Linux? Après avoir lu les réponses jusqu'à présent, je voudrais préciser quelque peu ma question: je préférerais une solution en C pur. Après avoir lu la source ps (qui se lit/proc /) Je pensais qu'il devrait y avoir une meilleure façon et demandé ici :)Comment déterminer l'état d'un processus (si c'est un zombie)

+0

Vous souhaitez éviter l'analyse de fichiers texte dans '/ proc'? Il n'y a pas d'autre moyen pour autant que je sache. –

+0

Modifier plutôt que de commenter pour modifier la question. – dmckee

+0

fait et retiré commentaire –

Répondre

7

Vous voudrez en savoir plus sur l'interaction avec/proc/"psuedo-filesystem" via les appels de bibliothèque standard C standard. La documentation nécessaire pour commencer est incluse avec n'importe quelle distribution Linux et est une simple recherche google loin.

(Maintenant que vous savez ce qu'il faut rechercher. Je sais que ce habituellement la plupart du défi!)

En bref, les répertoires et les fichiers dans le répertoire/proc/d'un système Linux en cours d'exécution reflètent l'état de le noyau en cours d'exécution, 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 que le parent du processus s'est terminé de manière incorrecte. Un processus de zombies est un processus qui s'est terminé correctement, libéré toutes ses ressources, mais qui maintient une place dans la table de processus.

Cela se produit généralement lorsqu'un processus est lancé par un programme. Vous voyez, le noyau ne supprime pas une entrée de sous-processus terminée dans la table de processus tant que le programme parent n'a pas récupéré correctement l'état de retour du sous-processus. Ça a du sens; Sinon, comment le programme parent peut-il savoir si le sous-processus s'est terminé de manière incorrecte?

Donc, tous les sous-processus sont techniquement des zombies pendant au moins très peu de temps. Ce n'est pas forcément un mauvais état pour un programme.

En effet, des "zombies" sont parfois créés intentionnellement. Par exemple, une entrée de zombie est parfois laissée en place par un programme pendant un certain temps, de sorte que les autres processus lancés n'obtiennent pas le même PID que le processus précédemment lancé (et maintenant zombie).En d'autres termes, si vous allez SIGCHLDing processus zombies inutilement, vous pourriez créer un problème sérieux pour le programme de spawn. Cependant, si un processus a été un zombie pendant une demi-heure ou plus, c'est probablement un signe d'un bug.

Modifier: La question a changé pour moi! Non, il n'y a pas de façon plus simple que la façon dont ps le fait. S'il y en avait, il aurait été intégré à ps il y a longtemps. Les fichiers/proc sont la source de toutes les informations sur l'état du noyau. :)

+0

C'est une belle discussion de la tâche posée pour un public moins sophistiqué – dmckee

+0

Votre réponse m'a amené à repenser mon approche de la correction d'un bug où le parent n'attendait pas les enfants correctement. J'ai réanalysé le code et trouvé le point où le parent a manqué d'attendre les enfants. Merci –

2

Je sais que deux façons:

  • Parsing sortie de la commande ps
  • lecture des fichiers/proc/PID où PID est l'identificateur de processus (c'est ce que ps interne ne)
+0

Je pense que vous devriez clarifier un peu – simplyharsh

0

here trouvé:

Use this command to display all of your zombie processes: 

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

Cela pourrait être facilement en utilisant C. parsé

2

Vous voulez que les processus en cours d'exécution sur votre machine puis utilisez

$ ps aux

ps affiche des informations sur une sélection des processus actifs . Si vous souhaitez une mise à jour répétitive de la sélection et les informations affichées, utilisez à la place top.

+0

ouais je suppose que TOP est une bonne idée. juste besoin d'être analysé dans C. – simplyharsh

+0

Je pense que "utiliser C" signifie dans un programme c (c'est-à-dire pas à l'invite de commande), et "sous Linux" vous indique à quelles API OS il a accès. – dmckee

+0

@dmckee hehe Je connais ce mec. :) – aatifh

0

Pseudo file system/proc décrit les structures de données internes du noyau et vous donne la possibilité de modifier directement certaines valeurs. L'obtention d'un état de processus particulier peut être facilement implémentée avec les fonctions I/O C. Le bon fichier à analyser est: /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 
Questions connexes