Для иерархии процессов нужно вести учет всех измений файловой системы, которые они делают (на самом деле не только ФС, но для простоты положим что только). Код должен быть кросс-платформенным, по крайней мере работать под Linux и *BSD.
Первая идея такая - сделать библиотеку для LD_PRELOAD, перехватывать там системные вызовы open (на запись), mkdir, rmdir, link, unlink и т.д. В плане напечатать в STDOUT изменяемые файлы работает отлично. Но проблема в том, что процесс порождает кучу дочерних, и нужен способ собрать информацию со всей иерархии в одной точке. Как это можно сделать?
Самое логичное было бы сделать следующее: - запускается управляющая программа, создает сокет, запускает корневой процесс нашей иерархии с LD_PRELOAD - библиотека пишет все изменяемые файлы в сокет, управляющая программа читает, сортирует, фильтрует и пишет в лог.
проблема в следующем: как из библиотеки узнать путь к управляющему сокету? Через переменную окружения его передать не канает, потому что кто-то из процессов может очистить (и очищает, сука) окружение. Глобальный путь также не канает, потому что процессов может быть несколько. Есть какой-то надежный способ передать в потомков какие-либо данные?
Может еще какие-то способы есть? Думал про ptrace(2), но не факт что она сможет отловить все что мне надо.
PS. Сейчас подумалось, что можно перехватывать еще и функцию setenv и не давать изменить переменную с адресом к сокету. Как вариант?