- Inotify
-
inotify
inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. В основное ядро была включена начиная с 2.6.13, но может использоваться и с более ранними ядрами с помощью наложения патча. Основная сфера использования — в системах поиска (например Beagle), таким образом программе-индексатору не требуется сканировать всю файловую систему каждые несколько минут.Содержание
Системные вызовы
Для работы с функциями нужно подключить заголовочный файл sys/inotify.h.
int inotify_init()
Создает файловый дескриптор, из которого читаются все происходящие события.
int inotify_add_watch(int fd, const char * path, __u32 mask);
Создает уникальный (внутри файлового дескриптора) дескриптор наблюдения (watch descriptor), который используется для отождествления путей и происходящих событий. При этом, допускаются только те события, которые указаны в маске.
int inotify_rm_watch(int fd, __u32 wd);
Удаляет существующий дескриптор наблюдения.
Получение событий
События получаются с помощью традиционного системного вызова read, который читает в структуру inotify_event со следующими полями:
Идентификатор Значение wd дескриптор наблюдения mask маска событий cookie метка синхронизации между IN_MOVED_FROM и IN_MOVED_TO len длина имени файла name имя файла относительно директории, для которой был создан дескриптор наблюдения Маска события является логическим ИЛИ следующих констант:
- IN_ACCESS — К файлу было произведено обращение (чтение)
- IN_ATTRIB — Были изменены метаданные (права доступа, временные метки, расширенные атрибуты и т.п.)
- IN_CLOSE_WRITE — Файл, открывавшийся для записи, был закрыт
- IN_CLOSE_NOWRITE — Файл, открывавшийся не для записи, был закрыт
- IN_CREATE — Файл/каталог был создан в наблюдаемой директории
- IN_DELETE — Файл/каталог был удален в наблюдаемой директории
- IN_DELETE_SELF — Наблюдаемый файл/каталог был удален
- IN_MODIFY — Файл был изменён
- IN_MOVE_SELF — Наблюдаемый файл/каталог был перемещен
- IN_MOVED_FROM — Файл/каталог был перемещен из наблюдаемой директории
- IN_MOVED_TO — Файл/каталог был перемещен в наблюдаемой директории
- IN_OPEN — Файл/каталог был открыт
При генерации событий также могут быть использованы следующие константы:
- IN_IGNORED — Наблюдение было снято либо вручную (inotify_rm_watch) либо автоматически (файловая система была размонтирована)
- IN_ISDIR — Объектом события является каталог
- IN_Q_OVERFLOW — Произошло переполнение очереди событий
- IN_UNMOUNT — Файловая система, содержащая объект наблюдения, была размонтирована
Пример кода
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/inotify.h> #include <sys/ioctl.h> int main(int argc, char **argv) { /* создание файлового дескриптора */ int ino_fd = inotify_init(); if (ino_fd < 0) { perror("inotify_init(): "); return 1; } /* создание дескриптора наблюдения всех событий на каталог указываемый первым параметром запуска */ int wd = inotify_add_watch(ino_fd, argv[1], IN_ALL_EVENTS); if (wd < 0) { perror("inotify_add_watch(): "); return 1; } /* цикл обработки событий */ while (1) { unsigned char *buf; struct inotify_event *ev; int bytes_to_parse; /* цикл ожидания событий */ do { if (ioctl(ino_fd, FIONREAD, &bytes_to_parse) == -1) { perror("ioctl(): "); return 1; } } while (bytes_to_parse < sizeof(struct inotify_event)); /* распределяем место под прибывшие события и читаем их*/ buf = (char *)malloc(bytes_to_parse); if (read(ino_fd, buf, bytes_to_parse) == -1) { perror("read(): "); return 1; } /* разбираем события и печатаем их */ int p; for (p = 0; p < bytes_to_parse; p += ev->len + 16) { ev = (struct inotify_event*) (buf + p); printf("wd = %d, mask = %08X, cookie = %d, len = %d, name = %s\n", ev->wd, ev->mask, ev->cookie, ev->len, &ev->name); } /* освобождаем память */ free(buf); } return 0; }
Ссылки
- man страницы
- Мониторинг системной активности при помощи inotify
- dnotify
- filemon
- kqueue - аналог inotify под FreeBSD (и, соответственно Mac OS X)
Wikimedia Foundation. 2010.