У меня есть небольшое приложение командной строки, написанное на C, которое выступает в качестве оболочки/запуска для других программ (think: xargs). Приложение написано для компиляции на FreeBSD/Linux (через fork()/exec()) и Windows (CreateProcess()). В дополнение к возможности перехватывать, вводить или иным образом манипулировать аргументами командной строки для дочернего приложения, мне было интересно, есть ли простой способ перехватить активность файловой системы дочерней программы (или ее детей и т. Д.). Меня интересуют только имена файлов, которые доступны для чтения или записи, но не для содержимого указанных файлов, и хотели бы, чтобы перехват был как можно более легким.Метод перехвата активности файловой системы дочернего процесса
В googling некоторые релевантные ключевые слова сверху, кажется, что есть много способов сделать это в Win32. От драйверов фильтра файловой системы до подделки заголовков таблицы импорта PE. Ни один из них не кажется тривиальным или что-то, что я мог бы скомпоновать внутри исполняемого файла моей программы-оболочки (например, для большинства из них потребуются дополнительные DLL или файлы драйверов вместе с основным исполняемым файлом.) Также мне хотелось бы, чтобы это работало в Windows XP до 7, если возможно , без необходимости взломать UAC или другие дельта платформы. Это мой детский процесс, поэтому я полагаю, что я должен быть в состоянии безопасно отслеживать его активность :)
В Linux существует inotify(), но он контролирует доступ к общей файловой системе без учета ТОЛЬКО моего дочернего процесса/es. То же самое можно сказать о kqueue() FreeBSD. Они также ломаются в случаях SMP, когда несколько экземпляров обертки могут запускать разные программы, и каждый из них должен устранить неоднозначность активности файловой системы своего ребенка друг от друга.
Я, конечно же, буду благодарен за любые предложения, которые может предложить сообщество SO.
Если вы хотите пройти этот маршрут, вам, вероятно, лучше перехватить системные вызовы, которые будут обращаться к файловой системе. open(), creat(), chmod(), exec *(). Могут быть и другие. –
^true, allthou пишет такую оболочку с реализациями для open(), fopen(), fdopen(), freopen() должен охватывать довольно много случаев. – rasjani
Этот подход кажется самым простым, и единственным недостатком является то, что мне нужно иметь отдельный файл разделяемой библиотеки «перехватчик» в дополнение к моему исполняемому файлу. Есть ли механизм, эквивалентный LD_PRELOAD на платформах Win32? – Optigrab