Comment trouver tous les processus enfants?
Dans une base Linux projet sur lequel je travaille, j'ai besoin d'être en mesure de trouver l'ensemble de mes enfant de processus. Il n'est pas possible d'enregistrer toutes les fois qu'on a commencé -- ils doivent être retrouvés après le fait. Ce doit être pure C, et j'aimerais le faire sans la lecture de /proc. Personne ne sait comment faire cela?
- Par pure C' j'étais en quelque sorte de dire "ne pas l'analyse de la sortie de commande'.
- Pourquoi n'est-il pas possible? C'est de loin la plus propre et la plus efficace de le faire.
- Êtes-vous opposé à l'écriture d'un LKM qui va l'emporter sur celui de la fraction inutilisée du système d'appels? Si oui, il serait trivial de faire un petit appel système qui vais le faire pour vous.
- Un LKM est en fait une assez bonne idée. Je suppose que j'ai laissé de côté -- c'est pour un très faible niveau de programme, qui doit être en mesure d'obtenir cette information lorsqu'elle est l'une des seules choses fonctionnelle sur un système d'amorçage. C'est pourquoi je ne veux pas l'appeler 'ps'. Pas tout à fait sûr de ce que mon aversion pour la lecture /proc était; je vais essayer à la fois un LKM et de la lecture /proc et voir ce qui fonctionne le mieux.
- Jun: je voulais tous les enfants du processus parent du processus actuel (à travers tous les processus de
ps
n'), auquel cas il n'est pas possible. Vrai, dans cette question dépend de ce que mon enfant procédés de dire: les enfants de processus en cours, ou les enfants de l'arbitraire d'un processus appartenant à l'utilisateur actif. Ressemble plus à l'ancien dans cette question.
Vous devez vous connecter pour publier un commentaire.
Je trouve votre commentaire qu'il n'est pas possible d'enregistrer la création de processus étrange, mais si vous ne pouvez vraiment pas (peut-être parce que vous ne savez pas combien sera créé et vous ne voulez pas avoir à garder
realloc
ing mémoire), alors je serais probablement ouvrir tous les fichiers qui correspondent à la glob/proc/[1-9]*/status
et recherchez la ligne qui ditPPid: <num>
où<num>
était mon id de processus.Il est généralement tout à fait possible d'enregistrer le processus chaque fois que vous démarrez un. idéalement, le processus parent est passé le pid du processus fils, la valeur de retour de la fourche à l'appel qu'elle crée.
Que la page de man dit:
Il serait utile si vous pouviez nous dire pourquoi vous pensez qu'il n'est pas envisageable.
Vous pouvez utiliser popen
Quelque chose comme. (J'espère que la syntaxe est assez proche)
Vous pouvez essayer ce
REMARQUE: Ce morceau de code doit être dans le processus parent
Fondamentalement
ps -o pid --ppid <parent_id>
donne le pid de tous les processus enfants dont le parent a PID<parent_id>
. Maintenant, nous pouvons obtenir le parent du processus de PID en utilisantgetpid()
, qui renvoiepid_t
et est implicitement converti en un entier.sprintf()
convertit en une chaîne de caractères et nous concaténer le résultat avecstr
à procurer l'intégralité de la commande qui est exécutée parsystem()
.system(str)
montrer à la sortie de la console & je veux aussi que tous les id dans un tableaups -o pid --ppid
reviendra également son propre pid comme la dernière pid dans la liste.Vous pu analyser une liste de processus (ps -ax?) qui inclus le parent de l'ID de processus. Cela pourrait être fait avec un simple script shell.
Si vous souhaitez suivre la fourche d'événements et d'en extraire de l'enfant pids à des fins de débogage, il y a un certain nombre de façons de le faire, y compris:
Si vous essayez d'obtenir tous les processus enfants pour le but très précis de les attendre à la sortie, vous pouvez utiliser waitpid(-1, ...):