inotify

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск


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;
}

Ссылки

en:Inotify fr:Inotify ko:Inotify pl:Inotify

Источник — «http://www.sbup.com/wiki/Inotify»
Личные инструменты

Served in 0.086 secs.