Inotify

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

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "Inotify" в других словарях:

  • Inotify — is a Linux kernel subsystem that provides file system event notification. It was written by John McCutchan with help from Robert Love and later Amy Griffis to replace dnotify. It was included in the mainline kernel from release 2.6.13 (2005 06… …   Wikipedia

  • inotify — est un mécanisme du noyau Linux qui fournit des notifications concernant le système de fichiers. Il a été écrit par John McCutchan avec l aide de Robert Love et plus tard par Amy Griffis pour remplacer dnotify. Il a été inclus dans la branche… …   Wikipédia en Français

  • Inotify — est un mécanisme du noyau linux qui fournit des notifications concernant le système de fichiers. Il a été écrit par John McCutchan avec l aide de Robert Love et plus tard par Amy Griffis pour remplacer dnotify. Il a été inclus dans la branche… …   Wikipédia en Français

  • inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. В основное ядро была включена начиная с 2.6.13, но может использоваться и с более ранними ядрами с помощью наложения патча. Основная сфера… …   Википедия

  • Linux-Kernel — Linux (Kernel) Entwickler Linus Torvalds u. v. m. Sprache(n) …   Deutsch Wikipedia

  • Linux (Kernel) — Bildschirmfoto …   Deutsch Wikipedia

  • Linux Kernel — Linux (Kernel) Entwickler Linus Torvalds u. v. m. Sprache(n) …   Deutsch Wikipedia

  • Linuxkernel — Linux (Kernel) Entwickler Linus Torvalds u. v. m. Sprache(n) …   Deutsch Wikipedia

  • O(1)-Scheduler — Linux (Kernel) Entwickler Linus Torvalds u. v. m. Sprache(n) …   Deutsch Wikipedia

  • Gamin — Gamin, a monitoring system for files and directories, independently implements a subset of FAM, the File Alteration Monitor. Running as a service, it allows for the detection of modifications to a file or directory. gam server functions as a… …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»