2010-01-14 3 views
1

J'ai ma propre application POSIX qui démarre un processus enfant. Je souhaite que le processus parent soit notifié avec les noms de tous les fichiers lus ou écrits par le processus enfant, ainsi que les noms de fichiers des processus enfants engendrés par l'enfant et des bibliothèques dynamiques qu'il charge. De même, j'ai besoin de surveiller tous les processus enfants engendrés par les processus enfants, etc.Dans un environnement POSIX, comment suivre les fichiers auxquels accède un processus fils?

Comment cela est-il fait?

Répondre

1

J'ai deux idées pour cela.

Méthode 1 - La "vraie façon".

Je pense que vous voulez ptrace. Mais ce ne sera pas facile à utiliser. Essentiellement, cet appel est pour l'écriture d'un débogueur. Notez que PTRACE_SYSCALL étapes jusqu'à la prochaine syscall. À ce stade, vous pourriez être en mesure d'utiliser plus d'appels ptrace pour jeter un coup d'œil à la mémoire du processus pour observer si c'est, disons, un appel à open().

Méthode 2 - La manière paresseuse et hackish.

Vous pouvez utiliser la variable d'environnement LD_PRELOAD. C'est-à-dire, écrivez une bibliothèque partagée avec votre propre implémentation des appels que vous voulez connecter (par exemple, open(), dlopen()), en ajoutant votre propre code et en l'envoyant à la version normale de la libc. Ensuite, pointez la variable d'environnement LD_PRELOAD sur cette bibliothèque partagée afin que l'éditeur de liens dynamique la charge au démarrage du processus. Un inconvénient de cette approche est que si un processus sait qu'il est observé de cette façon, il peut réinitialiser la variable d'environnement et s'exécuter à nouveau, et échapper à la détection. Une autre chose que je peux penser est que, en tant que fonctionnalité de sécurité, cette variable d'environnement n'est pas honorée si vous êtes root.

Questions connexes