inotify FAQ (Často kladené otázky)
-
Q: Co je to inotify?
inotify je notifikační mechanismus pro souborové systémy založený na inodech.
Podívejte se prosím do sekce
O inotify, kde najdete detaily.
-
Q: K čemu mohu inotify použít?
Technologie inotify je určena pro použití ve všech případech monitorování změn v souborovém systému.
Detaily najdete v sekci Proč používat.
-
Q: Která jádra podporují inotify?
Technologie inotify byla začleněna ve verzi 2.6.13. Vaše jádro musí mít inotify zakompilováno
(CONFIG_INOTIFY).
-
Q: Proč používat inotify a ne dnotify?
Je k tomu mnoho důvodů. První je, že dnotify "saje". Druhý je, že dnotify "saje" hodně.
A třetí, že dnotify "saje" strašně moc. Pro více informací viz
Proč používat.
-
Q: Jak používat inotify?
Hlavní koncept lze stručně popsat v těchto krocích:
- Vytvořte instanci inotify (inotify_init()).
- Přidejte ke sledování tolik souborů, kolik potřebujete (inotify_add_watch()).
- Pomocí read() čtěte události.
- Pro neblokující režim to udělejte stejně, jako v případě síťových socketů apod.
- Když už nějaký soubor nechcete sledovat, odeberte ho pomocí inotify_rm_watch().
- Po skončení zavolejte close() jako na jiný souborový deskriptor.
-
Q: Potřebuji pro inotify nějakou knihovnu?
Ne, nepotřebujete. inotify funguje na základě systémových volání, nikoli knihovních funkcí. Vše, co potřebujete,
je jádro s podporou inotify. Hlavičkové soubory, o který je tu někde řeč, pouze pomáhají používat inotify
jednodušeji (např. nemusíte hledat čísla systémových volání pro vaši platformu), ale nejsou zásadní.
-
Q: Existuje licenční omezení (kvůli tomu, že je jádro pod GPL)?
Ne. Systémová volání se považují za "normální použití". Je to podobné jako použití jiných systémových volání,
např. read() nebo gettimeofday(). Samotná implementace inotify (v jádře) je samozřejmě licencována pod
GPL a chcete-li tento kód použít, musíte licenci dodržet.
-
Q: Existuje C++ rozhraní pro inotify?
Ano, inotify-cxx. Toto rozhraní používá několik jednoduchých tříd, které poskytují základní funkcionalitu
inotify a ošetření chyb založené na výjimkách.
-
Q: Které jazyky (kromě C/C++) lze s inotify použít?
Existují rozhraní pro různé jazyky. Viz Odkazy.
-
Q: Lze používat inotify v neblokujícícm režimu?
Samozřejmě. Pro zapnutí příznaku O_NONBLOCK použijte normální funkci fcntl().
-
Q: Lze pro monitorování deskriptorů inotify použít select() nebo poll()?
Jistě. Souborový deskriptor inotify lze používat úplně stejně jako obecně kterýkoli jiný souborový deskriptor.
Používejte select(), poll() nebo epoll(), jak se vám to hodí.
-
Q: Lze inotify používat asynchronně?
Přestože se to nedoporučuje, lze to. Ale používejte real-time signály místo standardního SIGIO. Pro přepnutí
do režimu asynchronní notifikace zavolejte fcntl() s F_SETOWN, jako pro normální asynchronní hlášení I/O.
-
Q: Lze inotify používat přes signály?
Viz výše. Je lepší používat některý z real-time signálů, protože jsou řazeny do fronty. "Normální" signály
jako SIGIO jsou založeny na bitové masce.
-
Q: Je tu ioctl() volání FIONREAD?
Ano. Používejte s radostí!
-
Q: Existují omezení při použití inotify?
Ano. Některé souborové systémy (např. procfs nebo některé síťové systémy) v některých případech neemitují
události.
-
Q: Co se stane, když se sledovaný souborový systém odpojí?
Pokud se odpojí systém, kde bylo aktivní sledování inotify, jádro pošle událost IN_UMOUNT.
-
Q: Lze inotify používat mimo Linux?
Ne. Jde o linuxově specifickou záležitost. Ale jiné systémy mívají podobné mechanismy.
-
Q: Lze monitorovat celý podstrom nějakého adresáře?
Přímo ne. Můžete monitorovat pouze soubor nebo adresář (včetně všech souborů v tomto adresáři), ale už nic pod tím.
Chcete-li to udělat, musíte sledovat všechny podadresáře jednotlivě.
-
Q: Lze sledovat sysfs (procfs, nfs...)?
Jednoduše řečeno: ano, ale s určitými omezeními. Omezení se liší mezi různými verzemi jádra a postupně ubývají.
Podívejte se prosím na informace u jednotlivých souborových systémů.
-
Q: Jak zachytit přesně jednu událost?
Použijte příznak IN_ONESHOT. Přijde vám pouze první zaznamenaná událost.
-
Q: Co znamená IN_IGNORED a kdy se posílá?
IN_IGNORED se posílá, pokud se soubor přestává sledovat. Měli byste tuto událost zachytit a správně na ni reagovat.
-
Q: Co znamená IN_Q_OVERFLOW?
IN_Q_OVERFLOW je posílá, je-li příslušná fronta plná a nemůže pojmout další události. Objevuje-li se tato událost
častěji, měli byste rychleji číst události a případně zvětšit limit pro fronty. Limit lze zjistit/nastavit
přes příslušný soubor v procfs (/proc/sys/fs/inotify/max_queued_events).
-
Q: Jak je to s příznaky IN_ONLYDIR a IN_DONT_FOLLOW?
IN_ONLYDIR zajišťuje, že se událost objeví jen na adresáři. Pokud byste toto použili jako masku pro sledování
obyčejného souboru, nebudou vám chodit žádné události. IN_DONT_FOLLOW zakazuje následování symbolických odkazů (budou
monitorovány odkazy samotné a ne soubory, na které ukazují).
-
Q: Můj inotify.h neobsahuje hodnoty IN_ONLYDIR a IN_DONT_FOLLOW. Mohu je přesto používat?
Ano, ale musíte si je definovat ručně nebo používat přímo příslušné bitové masky. Není to však doporučeno. Lepší je
instalovat soubor, která je obsahuje (viz Stažení).
-
Q: Jaký je rozdíl mezi IN_MODIFY a IN_CLOSE_WRITE?
Událost IN_MODIFY se posílá při změně obsahu souboru (např. systémovým voláním write()), kdežto IN_CLOSE_WRITE
při uzavírání změněného souboru. Znamená to, že každá změnová operace vyvolá jednu událost IN_MODIFY (během
práce s otevřeným souborem jich může být mnoho), kdežto IN_CLOSE_WRITE se posílá pouze jednou, při zavírání
souboru.
-
Q: Zapisuji do souboru pomocí fprintf() a často se nepošle událost IN_MODIFY. Kde je problém?
Knihovní funkce jako fprintf() využívají buffer v paměti a nemusí pokaždé použít systémové volání k tomu, aby se
data skutečně zapsala do souboru. Pokud ke skutečnému zápisu nedojde, nepošle se ani událost IN_MODIFY. Zápis můžete
vynutit např. funkcí fflush(), ale pokud ji budete volat často, sníží to výkon programu.
-
Q: Je pro sledování změn v souboru lepší použít IN_MODIFY nebo IN_CLOSE_WRITE?
Záleží na konkrétním případu. Většinou je vhodnější použít IN_CLOSE_WRITE, protože v okamžiku poslání této události
jsou všechny provedené změny již bezpečně zapsány v souboru. Událost IN_MODIFY nemusí znamenat, že je změna úplně
dokončena (data mohou být ještě v paměti programu, nikoli v souboru). Naproti tomu, mnohé logy a podobné soubory
je potřeba sledovat pomocí IN_MODIFY - a to v případě, že zůstávají trvale otevřeny (nemůže se tedy ani poslat
po změně událost IN_CLOSE_WRITE).
-
Q: Proč u mého souboru nefunguje IN_MODIFY ani IN_CLOSE_WRITE?
Pravděpodobně jde o program, který neukládá změny přímo do původního souboru. Často si program vytvoří dočasný
soubor, do něj průběžně ukládá data a po uzavření ho přejmenuje na název původního souboru. Je to bezpečnější,
ale také to dost komplikuje sledování. Musí se zjistit, jak přesně program se soubory pracuje (pomůže např.
nástroj strace
) a podle toho nastavit sledování.
-
Q: Lze monitorovat spouštění programu?
Přímo ne. Lze monitorovat např. přístup ke spustitelnému souboru (IN_ACCESS), ale nelze rozlišit mezi čtením a
spouštěním. Je možnost to následně prověřovat v procfs, ale není to spolehlivé.
-
Q: Jak hlásit chyby?
Myslíte-li si, že jde opravdu o chybu, můžete ji ohlásit přes
Kernel Bug Tracker
nebo poslat do konference Linux Kernel Mailing List.