inotify – podsystem jądra Linuksa, który powiadamia o zdarzeniach w systemie plików. Został napisany przez Johna McCutchana z pomocą Roberta Love’a i później Amy Griffis w celu zastąpienia dnotify. Było zawarte w głównych wydaniach jądra Linuksa począwszy od wersji 2.6.13, a przy użyciu łat także w wersji 2.6.12 (być może jest to możliwe też we wcześniejszych wydaniach). Główną funkcją inotify jest rozszerzenie systemu plików o możliwość powiadamiania o zmianach w nim i raportowaniu tych zmian w aplikacjach.
Jego główne zastosowanie to użycie w narzędziach przeszukujących (ang. desktop search utilities) takich jak Beagle, gdzie może powiadamiać je o zmienionych plikach bez potrzeby częstego skanowania systemu plików (które byłoby bardzo nieefektywne). Informacje o zmianach w systemie plików są pobierane bezpośrednio z jądra systemu operacyjnego, dlatego zamiast aktywnego przeszukiwania odpowiednie narzędzia mogą indeksować zmiany kilka sekund po ich wystąpieniu, nie obniżając przy tym wydajności systemu.
Może być także używany do automatycznego uaktualniania widoków katalogów, ponownego wczytania plików konfiguracyjnych, logowania zmian, robienia kopii bezpieczeństwa i wszelkiego rodzaju synchronizacji.
Inotify posiada kilka zalet w stosunku do dnotify, modułu jądra który zastąpił. W starszym module program musiał używać jeden deskryptor pliku na każdy monitorowany katalog. Oznaczało to możliwość szybkiego wyczerpania się limitu ilości deskryptorów pliku na proces. Dodatkowo używanie deskryptorów plików przez dnotify było problemem w przypadku, gdy system plików mieścił się na wyjmowalnym nośniku danych. Wtedy ten nośnik nie mógł być odmontowany, ponieważ otwarte deskryptory plików wskazywały na jego zajętość. Inna wada dnotify to niska ziarnistość monitoringu, tzn. można było kontrolować tylko zmiany na poziomie katalogów. By zbadać, co dokładnie się w danym katalogu zmieniło, trzeba było dodatkowo używać struktur stat. Programiści byli zmuszeni wtedy do utrzymywania kolekcji tych struktur i gdy następowała zmiana w danym katalogu, to trzeba było utworzyć nową strukturę stat w celu porównania jej z poprzednio utrzymywanymi i określeniu charakteru tych zmian.
Inotify używa się za pomocą serii wywołań systemowych stworzonych dla inotify.
Na początku tworzy się instancję inotify,
int inotify_init()
które zwraca deskryptor pliku, z którego czytane są wszystkie zdarzenia. W celu obserwowania wybranego katalogu wywołuje się
int inotify_add_watch(int fd, const char* pathname, int mask)
które monitoruje węzeł systemu pliku inode wskazywany przez podaną ścieżkę pathname dla zdarzeń określonych za pomocą maski mask. Zwracany jest wtedy unikatowy (w ramach danej instancji) deskryptor monitorujący (ang. watch descriptor). Może tak się zdarzyć, że wiele ścieżek wskaże na ten sam węzeł inode/deskryptor monitorujący.
Wywołanie
int inotify_rm_watch(int fd, int wd)
usuwa monitoring wykonywany za pośrednictwem wskazanego deskryptora monitorującego wd.
Zdarzenia generowane przez inotify zawierają następujące informacje:
Identyfikator | Zawartość |
---|---|
wd
|
deskryptor monitorujący |
mask
|
znacznik zdarzenia |
cookie
|
cookie używanie do synchronizacji pomiędzy IN_MOVED_FROM and IN_MOVED_TO
|
len
|
długość pola name |
name
|
opcjonalna nazwa pliku powiązanego z tym zdarzeniem (w danym katalogu nadrzędnym) |
Wybrane zdarzenia, które można monitorować to:
IN_ACCESS
– odczyt plikuIN_MODIFY
– ostatnia modyfikacjaIN_ATTRIB
– zmiana atrybutów plikuIN_OPEN
i IN_CLOSE
– otwarcie albo zamknięcie plikuIN_MOVED_FROM
i IN_MOVED_TO
– gdy plik jest przenoszony lub zmienia mu się nazwęIN_DELETE
– kasowanie pliku/kataloguIN_CREATE
– tworzenie pliku/kataloguIN_DELETE_SELF
– monitorowany plik jest skasowany