Portál AbcLinuxu, 2. května 2025 20:25
Jako vedlejší efekt jednoho projektu, na kterém pracuji, vzniká i jednoduché C++ rozhraní k technologii inotify. Pro ty, kdo o inotify ještě neslyšeli: umožňuje sledovat události ve filesystému. Rozhraní pro C++ si nyní můžete stáhnout a použít ho pro své potřeby.
Nejdřív bych chtěl říct pár slov o tom, co vůbec je inotify. Je to technologie (umístěná v jádře), která umožňuje sledovat události, které nastanou v souborovém systému. Lze tak např. zjistit, že nám někdo "pod rukama" změnil soubor, že vytvořil nebo zrušil adresář, odpojil filesystém apod. Funguje tak, že se "pověsí" na inode a sleduje, co se tam děje.
Donedávna se v Linuxu k tomuto účelu používala technologie dnotify. Ta má však různé nepříjemné vlastnosti. Nejhorší z nich je nutnost mít na každý sledovaný adresář samostatný souborový deskriptor. Jednak je počet deskriptorů omezený, a také sledování je trochu problém - buď se musí sledovat každý deskriptor zvlášť (při větším počtu problém), nebo používat epoll()
, poll()
, anebo select()
, základním prostředkem byl však signál SIGIO
. Při větším počtu sledovaných adresářů si tento mechanismus vezme poměrně dost paměti v jádře. Navíc jsou problémy s výměnnými médii atd.
inotify většinu problémů odstraňuje. Souborový deskriptor stačí jeden, přes něj se pak aktivuje libovolný počet (do výše limitu) sledovaných cest (adresářů i souborů), klidně každá s jinou maskou (filtrem). Události se ukládají do fronty (společné pro souborový deskriptor), odkud je lze vybrat voláním read()
. Pro sledování deskriptoru lze použít libovolnou metodu (buď přímo read()
, nebo epoll()
, poll()
, select()
, případně signál).
inotify-cxx je C++ rozhraní, které má za cíl zjednodušit použití inotify v programech psaných v C++. Skládá se ze tří tříd. Základní je Inotify
, která obaluje souborový deskriptor, kromě toho spravuje také sledované cesty (viz dále) a má vlastní frontu událostí. Dále je tam třída InotifyWatch
, představující sledovací "hook". Poslední je pak InotifyEvent
, což je událost přijatá z inotify.
Celé to funguje tak, že si stačí vytvořit instanci (nebo více, podle potřeby) třídy Inotify
. Pak se vytvoří potřebný počet instancí InotifyWatch
a ty se přidají do Inotify
. Pro sledování je zatím k dispozici pouze jediná metoda, a to WaitForEvents()
, která blokuje do okamžiku, než přijdou nějaké události. Mám v plánu přidat tam další mechanismy sledování. Ohlásí-li WaitForEvents()
přijetí událostí, jsou tyto uloženy ve frontě a lze je získávat metodami GetEvent()
. Pro pouhé přečtení události (bez odebrání z fronty) lze použít PeekEvent()
.
V tuto chvíli se jedná o velice časnou verzi rozhraní, kterou budu na základě svých potřeb (a samozřejmě i požadavků jiných uživatelů) dále rozšiřovat a vylepšovat. Nicméně pro odzkoušení to dávám k dispozici již nyní - hlavně proto, že bych chtěl trochu zpopularizovat inotify, což je jedna z moderních věcí, přidaných do jádra teprve nedávno. Račte stahovat.
Rozhraní je k dispozici pod třemi licencemi - GPL, LGPL a X11. Ať si každý zvolí "tu svoji" licenci, pod kterou to bude používat. Ještě upozorním na nutnost mít jednak jádro 2.6.13 a pozdější, a také hlavičkové soubory pro inotify (obsahují rozhraní pro syscall a také definici datové struktury a označení bitů masky událostí).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.