J'ai besoin de savoir quelles bibliothèques un processus Unix a chargé et peut utiliser tout au long de sa vie. Est-ce possible et comment. Ou mieux encore, j'ai un nom de bibliothèque et j'ai besoin de savoir quels processus l'utilisent, est-ce possible?.
Dans le même ordre d'idées, est-il possible de se faire notifier comment un processus unix est lancé et quand il est arrêté. Ils ne seraient pas des processus enfants de mon processus, j'ai juste besoin de savoir globalement.
Mettre à jour:
Je pense que je n'ai pas donné assez d'informations. L'Unix dont je parlais était MacOS X (même si certains disent que ce n'est pas vraiment complètement Unix), et je cherchais un moyen de trouver les bibliothèques chargées d'un processus et j'ai besoin de le faire en C/C++.
si lsof n'est pas installé, vous pouvez simplement cat/proc/$ pid/maps
vous pouvez également vérifier les exécutables de disque avec ldd pour voir quelles bibliothèques elles vont ouvrir (mais cela ne montre pas les bibliothèques ouvertes de manière dynamique en utilisant dlopen ()).
En ce qui concerne la surveillance de nouveaux processus, vous pouvez éventuellement ajouter une surveillance inotify sur/proc pour surveiller la création/destruction de nouveaux répertoires uniquement numériques.
Mise à jour: inotify sur/proc ne fonctionne pas, mais il y a apparemment des alternatives, voir ce fil
Sur Mac OS X, vous pouvez utiliser vmmap $pid
pour obtenir une liste des régions de mémoire mappées pour un processus. Cela montre toutes les bibliothèques chargées (au moins ça marche pour moi ici 10.7.5).
ps -A
vous donnera une liste de tous les processus, donc ps -A | grep $APPNAME
vous donnera votre identifiant de processus $ pid à utiliser avec vmmap $pid
. lsof -p $pid
fonctionne également.
La question semble demander une méthode dynamique à partir de C++. Vous pouvez interroger avec ces commandes et analyser les résultats, même si vous pouvez rater des événements de chargement/déchargement rapide.
lsof
est un logiciel open source sous licence BSD. Son code source fournit sans aucun doute des informations sur la manière de procéder à partir de C/C++. Voir: http://fr.wikipedia.org/wiki/Lsof
Sous OS X, il suffit de définir DYLD_PRINT_LIBRARIES
export DYLD_PRINT_LIBRARIES=1
./your_process
vous pouvez utiliser lsof. Voir la page de manuel pour plus d'informations. Un autre outil est strace
. Pour voir si un processus est lancé, vous pouvez utiliser ps -ef
canalisé vers grep
, ou des outils comme pgrep
. vérifiez la valeur de retour pour savoir si elle est arrêtée ou non.
J'essaie (et j'échoue) de faire cela aussi. Regardez mach_vm_read et vm_region_recurse_64. Les applications à source fermée telles que vmmap et Crash Reporter d’Apple utilisent également ces méthodes, ainsi que la GDB en source ouverte. Vous pouvez essayer de chercher une réponse, mais la source est difficile à lire.
Je n'ai pas la réponse précise que vous cherchez, mais j'ai quelque chose de proche, qui vous mènera peut-être à ce que vous voulez. Vous pouvez afficher la bibliothèque liée d’un binaire spécifique (pas traiter) en:
EXEMPLE:
chris$ otool -L /usr/local/bin/mtr
mtr:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.1.0)