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)
Répondre
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. :)
C'est une belle discussion de la tâche posée pour un public moins sophistiqué – dmckee
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 –
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)
Je pense que vous devriez clarifier un peu – simplyharsh
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é
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.
ouais je suppose que TOP est une bonne idée. juste besoin d'être analysé dans C. – simplyharsh
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
@dmckee hehe Je connais ce mec. :) – aatifh
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
- 1. Comment déterminer si un ID de processus existe
- 2. Déterminer si stdout pour un processus Python est redirigé
- 3. Comment déterminer un processus "taille virtuelle" (WinXP)?
- 4. Comment déterminer si un assemblage est en cours d'utilisation?
- 5. Comment déterminer si le code .NET est en cours d'exécution dans un processus ASP.NET?
- 6. C# Comment déterminer si HTTPS
- 7. Comment déterminer si un fichier existe dans un SPFolder SharePoint
- 8. Déterminer si un type est statique
- 9. Comment déterminer si une adresse IP appartient à un pays
- 10. Comment déterminer si un DIB est ascendant ou descendant?
- 11. Comment déterminer si un fichier est chiffré avec EFS?
- 12. Comment déterminer si un objet Rails est marked_for_destruction?
- 13. Comment déterminer si un caractère est une lettre en Java?
- 14. Comment déterminer si un ordinateur exécute XP Service Pack 3
- 15. Comment déterminer si un contrôle est activé sur une page?
- 16. Comment déterminer si XML est bien formé?
- 17. Comment savoir si un processus est en cours d'exécution sur un périphérique mobile
- 18. MSBuild: Comment puis-je vérifier si un processus existe?
- 19. jQuery UI regenerate (zombie) éléments draggables
- 20. Déterminer si l'utilisateur est connecté
- 21. Comment déterminer le PID du parent d'un processus
- 22. Comment déterminer quel modèle de processus dans VS2010 utiliser?
- 23. Déterminer si un paramètre nommé a été passé
- 24. NHibernate: Déterminer si une propriété est mappée à un champ
- 25. Déterminer si une valeur existe dans un tableau de hachages
- 26. Déterminer si un point est sur une route
- 27. Déterminer si un message sur tcp a été livré
- 28. Comment déterminer un CFSocket invalide
- 29. Comment terminer un processus
- 30. Comment déterminer un composant swing?
Vous souhaitez éviter l'analyse de fichiers texte dans '/ proc'? Il n'y a pas d'autre moyen pour autant que je sache. –
Modifier plutôt que de commenter pour modifier la question. – dmckee
fait et retiré commentaire –