2009-06-23 7 views
1

У меня есть небольшое приложение командной строки, написанное на C, которое выступает в качестве оболочки/запуска для других программ (think: xargs). Приложение написано для компиляции на FreeBSD/Linux (через fork()/exec()) и Windows (CreateProcess()). В дополнение к возможности перехватывать, вводить или иным образом манипулировать аргументами командной строки для дочернего приложения, мне было интересно, есть ли простой способ перехватить активность файловой системы дочерней программы (или ее детей и т. Д.). Меня интересуют только имена файлов, которые доступны для чтения или записи, но не для содержимого указанных файлов, и хотели бы, чтобы перехват был как можно более легким.Метод перехвата активности файловой системы дочернего процесса

В googling некоторые релевантные ключевые слова сверху, кажется, что есть много способов сделать это в Win32. От драйверов фильтра файловой системы до подделки заголовков таблицы импорта PE. Ни один из них не кажется тривиальным или что-то, что я мог бы скомпоновать внутри исполняемого файла моей программы-оболочки (например, для большинства из них потребуются дополнительные DLL или файлы драйверов вместе с основным исполняемым файлом.) Также мне хотелось бы, чтобы это работало в Windows XP до 7, если возможно , без необходимости взломать UAC или другие дельта платформы. Это мой детский процесс, поэтому я полагаю, что я должен быть в состоянии безопасно отслеживать его активность :)

В Linux существует inotify(), но он контролирует доступ к общей файловой системе без учета ТОЛЬКО моего дочернего процесса/es. То же самое можно сказать о kqueue() FreeBSD. Они также ломаются в случаях SMP, когда несколько экземпляров обертки могут запускать разные программы, и каждый из них должен устранить неоднозначность активности файловой системы своего ребенка друг от друга.

Я, конечно же, буду благодарен за любые предложения, которые может предложить сообщество SO.

ответ

0

Напишите библиотеку «interposer», которая перехватывает ваш fopen и устанавливает переменную среды LD_PRELOAD для всех дочерних процессов. Это работает с динамически связанными библиотеками.

Пример того, как это сделать, можно найти здесь: http://developers.sun.com/solaris/articles/lib_interposers.html и http://lists.debian.org/debian-powerpc/2004/11/msg00039.html показывает частичную реализацию для FOPEN() ..

вставкой
+0

Если вы хотите пройти этот маршрут, вам, вероятно, лучше перехватить системные вызовы, которые будут обращаться к файловой системе. open(), creat(), chmod(), exec *(). Могут быть и другие. –

+0

^true, allthou пишет такую ​​оболочку с реализациями для open(), fopen(), fdopen(), freopen() должен охватывать довольно много случаев. – rasjani

+0

Этот подход кажется самым простым, и единственным недостатком является то, что мне нужно иметь отдельный файл разделяемой библиотеки «перехватчик» в дополнение к моему исполняемому файлу. Есть ли механизм, эквивалентный LD_PRELOAD на платформах Win32? – Optigrab

3

Единственное предложение, которое я сделал бы это использовать strace (система трассировки вызовов и сигналов), хотя это скорее средство отладки, и не влияет на производительность процесса, прослежена

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> 

ИМХО - если вы знакомы с strace, он всегда является полезным инструментом в арсенале.

+0

Спасибо, Бино. Я использовал strace, но не знал о ярлыке -e trace = file ... очень удобно. К сожалению, штраф за производительность немного высок, так как он использует ptrace (2) под капотом. – Optigrab