Ядерная слежка Alexander S. Salieff Спецвыпуск: Хакер, номер #062, стр. 062-056-4 FAMConnection fc; if (FAMOpen(&fc)!=0) exit(1); В рамках созданного соединения можно создавать запросы на мониторинг. Так как FAM реализован в виде архитектуры клиент-сервер, имена файлов и директорий нужно передавать в абсолютной форме, относительное именование недопустимо: FAMRequest fr; FAMMonitorDirectory(&fc, "/home/usr/mydir", &fr, NULL); FAMMonitorFile(&fc, "/home/usr/mydir", &fr, NULL); После того как соединение включит в себя хотя бы один запрос на мониторинг, нужно проверять его на предмет появления событий, считывать эти события и обрабатывать: if (FAMPending(&fc)<=0) break; FAMEvent fe; if (FAMNextEvent(&fc, &fe)<=0) break; MyEventHandle(fe); Полученное событие оформлено в виде структуры FAMEvent и содержит дескрипторы соединения и запроса, имена хоста и файла, полезную нагрузку (тот самый указатель в четвертом аргументе функция создания запроса) и код, сигнализирующий, что конкретно произошло с объектом наблюдения: struct FAMEvent { FAMConnection* fc; FAMRequest fr; char *hostname; char filename[PATH_MAX]; void *userdata; FAMCodes code; }; Если не хочется полагаться на FAMPending и требуется создать собственную систему, которая использует демультиплексированный ввод-вывод при общении с сервером, то можно запросить дескриптор соединения с сервером с помощью следующего макроса: int fam_fd = FAMCONNECTION_GETFD(&fc); fd_set readfds; FD_ZERO(&readfds); FD_SET(fam_fd, &readfds); while(!break_flag) { if (select(fam_fd+1, &readfds, NULL, NULL, NULL)<0) exit(1); if (!FD_ISSET(fam_fd, &readfds)) continue; if (FAMNextEvent(&fc, &fe) < 0) ... Получение событий можно приостанавливать и возобновлять либо окончательно завершать избирательно для различных запросов, оперируя дескрипторами, полученными при их создании и общим дескриптором соединения: FAMSuspendMonitor(&fc, &fr); FAMResumeMonitor(&fc, &fr); FAMCancelMonitor(&fc, &fr); В принципе, описанного вполне достаточно, чтобы создать свою FAM-базированную систему. FAM-демон — это незаметный, но вполне востребованный компонент современного UNIX-дистрибутива. И хотя многие не замечают этого, к его услугам активно прибегает масса софта, в том числе и системно-административные программы, и вполне пользовательские, к примеру, входящие в состав KDE Маски Inotify IN_ACCESS — был доступ к файлу IN_MODIFY — файл модифицирован |