Question

J'ai une petite application de ligne de commande écrite en C qui agit comme un wrapper / launcher pour d'autres programmes (think: xargs). L'application est écrite pour être compilée sur FreeBSD / Linux (via fork () / exec ()) et Windows (CreateProcess ()). En plus de pouvoir intercepter, injecter ou autrement manipuler les arguments de ligne de commande de l'application enfant, je me demandais s'il existait un moyen facile d'intercepter l'activité du système de fichiers du programme enfant (ou ses enfants, etc.). Je m'intéresse principalement aux noms de fichiers auxquels on a accédé en lecture ou en écriture, mais pas au contenu de ces fichiers, et j'aimerais que l'interception soit aussi légère que possible.

Lors de la recherche de mots clés pertinents dans Google, il semble qu'il existe de nombreuses façons de le faire dans Win32. Des pilotes de filtres du système de fichiers à l'altération des en-têtes de table d'importation PE. Rien de tout cela ne semble trivial ou quelque chose que je pourrais auto-contenir dans l'exécutable de mon wrapper (par exemple, la plupart aurait besoin de DLL ou de fichiers de pilotes supplémentaires à côté de l'exécutable principal.) De plus, j'aimerais que cela fonctionne sous Windows XP à 7, si possible. , sans avoir à pirater UAC ou d’autres deltas de la plate-forme. Il s’agit du processus de mon enfant. Je pense donc que je devrais être en mesure de surveiller son activité en toute sécurité:)

Sous Linux, il existe inotify (), mais il surveille l’accès au système de fichiers général sans tenir compte SEULEMENT de mes processus enfants. Même chose pour kqueue () de FreeBSD. Celles-ci tombent également en panne dans les cas SMP où plusieurs instances de l'encapsuleur exécutent différents programmes et où chacune doit différencier l'activité du système de fichiers de son propre enfant.

J'apprécierais certainement toutes les suggestions de la part de la communauté SO.

Était-ce utile?

La solution

Ecrivez un "intercalaire". bibliothèque qui relie votre fopen et définit la variable d’environnement LD_PRELOAD pour tous les processus enfants. Cela fonctionne avec les bibliothèques liées dynamiquement tu.

Vous trouverez un exemple de procédure à suivre ici: http: // développeurs. sun.com/solaris/articles/lib_interposers.html et http://lists.debian.org/debian-powerpc/2004/11/msg00039.html montre une implémentation partielle de l'intercalaire fopen ().

Autres conseils

La seule suggestion que je ferais est d'utiliser strace (suivi des appels système et des signaux), bien qu'il s'agisse davantage d'un outil de débogage et qu'il affecte les performances du processus en cours de traçage

strace -f -e trace=file -o <output-file> <cmd-line>

-f - follow forks
-e trace=file - will output system calls related to the file-system
-o <output-file>

IMHO - si vous vous familiarisez avec strace , c'est toujours un outil utile à avoir dans l'armurerie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top