Domanda

Ho una piccola applicazione da riga di comando scritta in C che funge da wrapper / launcher per altri programmi (pensate: xargs). L'applicazione è scritta per essere compilata su FreeBSD / Linux (tramite fork () / exec ()) e Windows (CreateProcess ()). Oltre a poter intercettare, iniettare o altrimenti manipolare gli argomenti della riga di comando per l'applicazione figlio, mi chiedevo se esiste un modo semplice per intercettare l'attività del filesystem del programma figlio (o i suoi figli, e così via). Mi interessa principalmente solo i nomi dei file a cui si accede sia in lettura che in scrittura, ma non il contenuto di tali file e vorrei che l'intercettazione fosse il più leggera possibile.

Nel cercare su Google alcune parole chiave pertinenti dall'alto, sembra che ci siano molti modi per farlo in Win32. Dai driver di filtro del file system alla manomissione delle intestazioni della tabella di importazione PE. Nessuno di questi sembra banale o qualcosa che potrei auto-contenere all'interno dell'eseguibile del mio programma wrapper (ad esempio, la maggior parte richiederebbe DLL o file di driver aggiuntivi insieme all'eseguibile principale.) Inoltre, mi piacerebbe che funzionasse su Windows XP attraverso 7, se possibile , senza dover hackerare UAC o altri delta della piattaforma. È il mio processo figlio, quindi immagino che dovrei essere in grado di monitorare in modo sicuro la sua attività :)

Su Linux, c'è inotify (), ma controlla l'accesso generale al filesystem senza considerare SOLO i miei processi figlio. La stessa cosa vale per kqueue () di FreeBSD. Questi si rompono anche nei casi SMP in cui più istanze del wrapper potrebbero eseguire programmi diversi e ognuno deve chiarire le attività del file system del proprio figlio l'una dall'altra.

Gradirei sicuramente qualsiasi suggerimento che la comunità SO possa offrire.

È stato utile?

Soluzione

Scrivi un "interposer" libreria che aggancia il fopen e imposta la variabile d'ambiente LD_PRELOAD per tutti i processi figlio. Funziona con le librerie collegate dinamicamente tu.

Un esempio di come eseguire questa operazione è disponibile qui: http: // sviluppatori. sun.com/solaris/articles/lib_interposers.html e http://lists.debian.org/debian-powerpc/2004/11/msg00039.html mostra un'implementazione parziale per fopen () interposer ..

Altri suggerimenti

L'unico suggerimento che vorrei fare è usare strace (traccia chiamate e segnali di sistema), anche se si tratta più di uno strumento di debug e influisce sulle prestazioni del processo da tracciare

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 - se hai familiarità con strace , è sempre uno strumento utile da avere nell'armeria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top