Ez a cikk bemutatja, hogyan használják az Inotify-t a fájlok és könyvtárak létrehozásának, törlésének vagy módosításának nyomon követésére a Linux fájlrendszerben.
Egy adott fájl vagy könyvtár figyeléséhez az Inotify használatával kövesse az alábbi lépéseket:
- Hozzon létre egy inotify példányt a inotify_init ()
- Adja meg a könyvtár vagy a figyelni kívánt fájl teljes elérési útját, valamint a megtekintendő eseményeket a funkció használatával inotify_add_watch (). Ugyanabban a függvényben megadjuk, hogy mely események (LÉTREHOZÁSON, HOZZÁFÉRÉSHEZ, MÓDOSÍTÁSON stb.).), a fájlok vagy a könyvtár változását figyelemmel kell kísérni.
- Várja meg az események bekövetkezését, és olvassa el a puffert, amely egy vagy több eseményt tartalmaz, a olvas() vagy válassza ()
- Feldolgozza a bekövetkezett eseményt, majd térjen vissza a 3. lépésre, hogy várjon további eseményeket, és ismételje meg.
- Távolítsa el az óra leírót a inotify_rm_watch ()
- Zárja be az inotify példányt.
Most látni fogjuk az Inotify API-hoz használt funkciókat.
Fejlécfájl: sys / inotify.h
inotify_init () funkció:
Szintaxis: int inotify_init (void)
Érvek: Nincsenek érvek.
Visszatérési értékek: Siker esetén a függvény új fájlleírót ad vissza, meghibásodás esetén a függvény -1-et ad vissza.
inotify_add_watch () funkció:
Szintaxis: int inotify_add_watch (int fd, const char * elérési út, uint32_t maszk)
Érvek:
Ennek a függvénynek három argumentuma van.
Az 1utca argument (fd) egy fájlleíró, amely az inotify példányra utal (a inotify_init () funkció) .
A 2nd argument a figyelt könyvtár vagy fájl elérési útja.
A 3rd érv bitmaszk. A bitmaszk a figyelt eseményeket jelenti. Megtekinthetünk egy vagy több eseményt a bitenkénti-OR használatával.
Visszatérési értékek: Siker esetén a függvény egy figyelőleírót ad vissza, a meghibásodás esetén a függvény -1-et ad vissza.
inotify_rm_watch () funkció:
Szintaxis: int inotify_rm_watch (int fd, int32_t wd)
Érvek:
Ennek a függvénynek két argumentuma van.
Az 1utca argument (fd) egy fájlleíró, amely az inotify példányra hivatkozik (a inotify_init () funkció) .
A 2nd argument (wd) egy figyelő leíró (a inotify_add_watch () funkció) .
Visszatérési értékek: Siker esetén a függvény értéke 0, kudarc esetén a függvény értéke -1.
Használunk olvas() funkció (deklarálva: unistd.h fejléc fájl) a puffer elolvasására, amely az események információit tárolja a inotify_event szerkezet. A inotify_event szerkezetét deklarálják sys / inotify.h fejlécfájl:
struct inotify_eventint32t wd;
uint32_t maszk;
uint32_t süti;
uint32_t len;
char neve [];
A inotify_event A struktúra az inotify rendszer által visszaadott fájlrendszeri eseményt jelenti, és a következő tagokat tartalmazza:
- wd: Óraleíró (visszatérési értéke inotify_add_watch () funkció)
- maszk: Egy kis maszk, amely az összes eseménytípust tartalmazza
- aprósütemény: Egyedi szám, amely azonosítja az eseményeket
- len: Bájtok száma a név mezőben
- név: Annak a fájlnak vagy könyvtárnak a neve, amelyben az esemény történt
Az alábbiakban egy működő példa található az Inotify API használatával:
Inotify.c fájl:
#include#include
#include
#include
#include
#include
#define MAX_EVENTS 1024 / * A feldolgozandó események maximális száma * /
#define LEN_NAME 16 / * Feltéve, hogy a fájlnév hossza
nem haladja meg a 16 bájtot * /
#define EVENT_SIZE (sizeof (struct inotify_event)) / * egy esemény mérete * /
#define BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * puffer az események adatainak tárolásához * /
int fd, wd;
void sig_handler (int sig)
/ * 5. lépés. Távolítsa el az óra leírót, és zárja le az inotify példányt * /
inotify_rm_watch (fd, wd);
bezár (fd);
kilépés (0);
int main (int argc, char ** argv)
char * path_to_be_watched;
jel (SIGINT, sig_handler);
path_to_be_watched = argv [1];
/* 1. lépés. Inotify inicializálása * /
fd = inotify_init ();
if (fcntl (fd, F_SETFL, O_NONBLOCK) < 0) // error checking for fcntl
kijárat (2);
/* 2. lépés. Watch hozzáadása * /
wd = inotify_add_watch (fd, path_to_be_watched, IN_MODIFY | IN_CREATE | IN_DELETE);
if (wd == - 1)
printf ("Nem sikerült megnézni:% s \ n", elérési út_megfigyelt_út);
más
printf ("Néz:% s \ n", elérési út_megtekintve);
míg (1)
int i = 0, hossza;
char puffer [BUF_LEN];
/ * 3. lépés. Olvasási puffer * /
hossz = olvasás (fd, puffer, BUF_LEN);
/ * 4. lépés. A bekövetkezett események feldolgozása * /
miközben én
struct inotify_event * esemény = (struct inotify_event *) & puffer [i];
if (esemény-> len)
if (esemény-> maszk & IN_CREATE)
if (esemény-> maszk és IN_ISDIR)
printf ("A% s könyvtár létrehozva.\ n ", esemény-> név);
más
printf ("A% s fájl létrehozva.\ n ", esemény-> név);
else if (esemény-> maszk & IN_DELETE)
if (esemény-> maszk és IN_ISDIR)
printf ("A (z)% s könyvtár törölve lett.\ n ", esemény-> név);
más
printf ("A (z)% s fájl törölve lett.\ n ", esemény-> név);
else if (esemény-> maszk & IN_MODIFY)
if (esemény-> maszk és IN_ISDIR)
printf ("A% s könyvtár megváltozott.\ n ", esemény-> név);
más
printf ("A% s fájl módosult.\ n ", esemény-> név);
i + = ESEMÉNY_SIZE + esemény-> len;
Kimenet:
A program végrehajtásához és a kimenet megtekintéséhez először két terminált kell megnyitnunk. Egy terminált használnak a program futtatására Inotify.c. A második terminálon arra az útra lépünk, amelyet az Inotify figyel.c. Ha létrehozunk bármilyen könyvtárat vagy fájlt, módosítunk bármilyen fájlt, vagy törölünk bármilyen könyvtárat vagy fájlt, akkor ezeket látni fogjuk az első terminálon.
Ban,-ben Inotify.c például a unistd.h fejlécfájl a olvas() és Bezárás() funkció, a stdlib.h fejlécfájl a kijárat() funkció, a jel.h fejlécfájl a jel() funkció és a SIG_INT makró (a részletekért lásd a jelkezelést), és a fcntl.h fejlécfájl a fcntl () funkció.
Kijelentjük fd (inotify példány) és wd (watch descriptor) globális változóként, hogy ezek a változók minden funkcióból elérhetőek legyenek.
A fcntl () függvényt úgy használjuk, hogy amikor a fd leíró, a szál nem lesz blokkolva.
Ezután hozzáadunk egy órát a inotify_add_watch () funkció. Itt adjuk át az fd-t, a figyelni kívánt könyvtár útvonalát és a maszkot. A megfigyelni kívánt események maszkját a bitenként-OR segítségével adhatja át.
Most olvassa el a puffert. Egy vagy több eseményről információkat tárol a puffer. Az összes eseményt egyenként feldolgozhatja a hurok segítségével. Ellenőrizheti az esemény-> maszkot, hogy megtudja, milyen típusú események történtek.
Végtelen idő ciklust használunk az események folyamatos ellenőrzésére. Ha nem történt esemény, a read () függvény 0-val tér vissza. A read () függvény visszatérési értéke a hosszúság változóban tárolódik. Ha a hosszváltozó értéke nagyobb, mint nulla, egy vagy több esemény történt.
Használjuk a SIG_INT jel (nyomja meg a Ctrl + C billentyűkombinációt) a folyamatból való kilépéshez. A Ctrl + C megnyomásakor a sig_handler () hívják a funkciót (a részletekért lásd a jelkezelést). Ez a funkció eltávolítja az óra leíróját, bezárja az inotify példányt fd, és kilép a programból.
Következtetés
Az Inotify API-t használhatja saját alkalmazásaiban a maga módján történő figyelésre, hibakeresésre, automatizálásra és egyebekre. Itt láthattuk az Inotify API végrehajtási folyamatát.