Способ перехвата активности файловой системы дочернего процесса - PullRequest
1 голос
/ 23 июня 2009

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 23 июня 2009

Единственное, что я хотел бы сделать, - это использовать 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 голосов
/ 23 июня 2009

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

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

...