C programozás

Az inotify API használata C nyelven

Az inotify API használata C nyelven
Az Inotify egy Linux API, amelyet a fájlrendszer eseményeinek megfigyelésére használnak.

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:

  1. Hozzon létre egy inotify példányt a inotify_init ()
  2. 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.
  3. 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 ()
  4. 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.
  5. Távolítsa el az óra leírót a inotify_rm_watch ()
  6. 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_event
int32t 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:

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 // könyvtár az fcntl függvényhez
 
#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.

Az Xdotool használata az egérkattintások és a billentyűleütések ösztönzéséhez Linux alatt
Az Xdotool egy ingyenes és nyílt forráskódú parancssori eszköz az egérkattintások és a billentyűleütések szimulálására. Ez a cikk egy rövid útmutatót ...
A top 5 ergonómikus számítógépes egértermék Linuxhoz
Hosszan tartó számítógép-használat okoz-e fájdalmat a csuklóján vagy az ujjain?? Merev ízületek szenvednek, és folyamatosan kezet kell rázniuk? Égő fá...
Az egér és az érintőpad beállításainak módosítása az Xinput használatával Linux alatt
A legtöbb Linux disztribúció alapértelmezés szerint „libinput” könyvtárral szállítja a rendszer bemeneti eseményeit. Feldolgozhatja a Wayland és az X ...