Tento článok vám ukáže, ako sa Inotify používa na sledovanie vytvárania, mazania alebo úprav súborov a adresárov súborového systému Linux.
Ak chcete pomocou Inotify monitorovať konkrétny súbor alebo adresár, postupujte takto:
- Vytvorte inštanciu inotify pomocou inotify_init ()
- Pridajte úplnú cestu k adresáru alebo súboru, ktorý chcete monitorovať, a udalostiam, ktoré sa majú sledovať, pomocou tejto funkcie inotify_add_watch (). V tej istej funkcii určíme, ktoré udalosti (ON CREATE, ON ACCESS, ON MODIFY atď.) je potrebné monitorovať zmeny súborov alebo zmeny adresára.
- Počkajte, kým sa vyskytnú udalosti, a pomocou príkazu čítať() alebo vyberte ()
- Spracujte udalosť, ku ktorej došlo, potom sa vráťte ku kroku 3, počkajte na ďalšie udalosti, a opakujte.
- Odstráňte deskriptor hodiniek pomocou inotify_rm_watch ()
- Zatvorte inštanciu inotify.
Teraz uvidíme funkcie, ktoré sa používajú pre Inotify API.
Hlavičkový súbor: sys / inotify.h
inotify_init () funkcia:
Syntax: int inotify_init (void)
Argumenty: Žiadne argumenty.
Návratové hodnoty: Pri úspechu funkcia vráti nový deskriptor súboru, pri zlyhaní funkcia vráti -1.
inotify_add_watch () funkcia:
Syntax: int inotify_add_watch (int fd, const char * cesta, maska uint32_t)
Argumenty:
Táto funkcia má tri argumenty.
1sv argument (fd) je deskriptor súboru, ktorý odkazuje na inštanciu inotify (návratová hodnota z inotify_init () funkcia) .
2nd argument je cesta k adresáru alebo súboru, ktorý je monitorovaný.
3rd argument je bitová maska. Bitová maska predstavuje udalosti, ktoré sa sledujú. Pomocou bitového operátora OR môžeme sledovať jednu alebo viac udalostí.
Návratové hodnoty: Pri úspechu funkcia vráti deskriptor hodiniek, pri poruche funkcia vráti -1.
inotify_rm_watch () funkcia:
Syntax: int inotify_rm_watch (int fd, int32_t wd)
Argumenty:
Táto funkcia má dva argumenty.
1sv argument (fd) je deskriptor súboru, ktorý odkazuje na inštanciu inotify (návratová hodnota z inotify_init () funkcia) .
2nd argument (wd) je deskriptor hodiniek (návratová hodnota z inotify_add_watch () funkcia) .
Návratové hodnoty: Pri úspechu funkcia vráti 0, pri zlyhaní funkcia vráti -1.
Používame čítať() funkcia (deklarovaná v unistd.h hlavička súbor) na načítanie vyrovnávacej pamäte, v ktorej sú uložené informácie o udalostiach, ku ktorým došlo vo forme inotify_event štruktúra. The inotify_event štruktúra je deklarovaná v sys / inotify.h hlavičkový súbor:
struct inotify_eventint32t wd;
maska uint32_t;
uint32_t cookie;
uint32_t len;
char meno [];
The inotify_event štruktúra predstavuje udalosť súborového systému vrátenú systémom inotify a obsahuje nasledujúcich členov:
- wd: Sledujte deskriptor (návratová hodnota z inotify_add_watch () funkcia)
- maska: Bitová maska, ktorá obsahuje všetky typy udalostí
- cookie: Jedinečné číslo, ktoré identifikuje udalosti
- len: Počet bajtov v poli názvu
- názov: Názov súboru alebo adresára, v ktorom k udalosti došlo
Nasleduje funkčný príklad použitia rozhrania Inotify API:
Inotifikovať.súbor c:
#include#include
#include
#include
#include
#include
#define MAX_EVENTS 1024 / * Maximálny počet udalostí na spracovanie * /
#define LEN_NAME 16 / * Za predpokladu, že dĺžka názvu súboru
nepresiahne 16 bajtov * /
#define EVENT_SIZE (sizeof (struct inotify_event)) / * veľkosť jednej udalosti * /
#define BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * medzipamäť na ukladanie údajov o udalostiach * /
int fd, wd;
void sig_handler (int sig)
/ * Krok 5. Odstráňte deskriptor hodiniek a zatvorte inštanciu inotify * /
inotify_rm_watch (fd, wd);
zavrieť (fd);
výstup (0);
int main (int argc, char ** argv)
char * path_to_be_watched;
signál (SIGINT, sig_handler);
path_to_be_watched = argv [1];
/* Krok 1. Inicializovať inotify * /
fd = inotify_init ();
if (fcntl (fd, F_SETFL, O_NONBLOCK) < 0) // error checking for fcntl
východ (2);
/* Krok 2. Pridať hodinky * /
wd = inotify_add_watch (fd, path_to_be_watched, IN_MODIFY | IN_CREATE | IN_DELETE);
if (wd == - 1)
printf ("Nemohol sledovať:% s \ n", path_to_be_watched);
else
printf ("Sledujem:% s \ n", cesta_k_be_pozerane);
while (1)
int i = 0, dĺžka;
char buffer [BUF_LEN];
/ * Krok 3. Čítať vyrovnávaciu pamäť * /
length = read (fd, buffer, BUF_LEN);
/ * Krok 4. Spracovať udalosti, ku ktorým došlo * /
kým
struct inotify_event * event = (struct inotify_event *) & buffer [i];
if (event-> len)
if (event-> mask & IN_CREATE)
if (event-> mask & IN_ISDIR)
printf ("Bol vytvorený adresár% s.\ n ", event-> meno);
else
printf ("Súbor% s bol vytvorený.\ n ", event-> meno);
else if (event-> mask & IN_DELETE)
if (event-> mask & IN_ISDIR)
printf ("Adresár% s bol odstránený.\ n ", event-> meno);
else
printf ("Súbor% s bol odstránený.\ n ", event-> meno);
else if (event-> mask & IN_MODIFY)
if (event-> mask & IN_ISDIR)
printf ("Bol zmenený adresár% s.\ n ", event-> meno);
else
printf ("Súbor% s bol upravený.\ n ", event-> meno);
i + = EVENT_SIZE + udalosť-> len;
Výkon:
Aby sme vykonali program a videli výstup, musíme najskôr otvoriť dva terminály. Na spustenie programu sa používa jeden terminál Inotifikovať.c. V druhom termináli ideme na cestu, ktorú sleduje Inotify.c. Ak vytvoríme akýkoľvek adresár alebo súbor, upravíme akýkoľvek súbor alebo odstránime akýkoľvek adresár alebo súbor, uvidíme ich na prvom termináli.
V Inotifikovať.c napríklad unistd.h hlavičkový súbor sa používa pre čítať() a Zavrieť() funkcia, stdlib.h hlavičkový súbor sa používa pre východ() funkcia, signál.h hlavičkový súbor sa používa pre signál () funkcie a SIG_INT makro (podrobnosti nájdete v časti Spracovanie signálu) a symbol fcntl.h hlavičkový súbor sa používa pre fcntl () funkcia.
Vyhlasujeme fd (inotify inštancia) a wd (deskriptor sledovania) ako globálne premenné, aby boli tieto premenné prístupné zo všetkých funkcií.
The fcntl () funkcia sa používa tak, že keď čítame pomocou fd deskriptor, vlákno nebude blokované.
Ďalej pridáme hodinky pomocou inotify_add_watch () funkcia. Tu minieme fd, cestu k adresáru, ktorý sa bude sledovať, a masku. Masku udalostí, ktoré chcete sledovať, môžete odovzdať pomocou bitového ALEBO.
Teraz si prečítajte medzipamäť. Informácie o jednej alebo viacerých udalostiach sa ukladajú do medzipamäte. Pomocou slučky môžete spracovávať všetky udalosti po jednom. Môžete skontrolovať masku udalosti-> a zistiť, aký typ udalostí sa stal.
Na nepretržitú kontrolu výskytu udalostí používame nekonečnú slučku while. Ak sa nestali žiadne udalosti, funkcia read () sa vráti s 0. Návratová hodnota funkcie read () je uložená v premennej length. Keď je hodnota premennej dĺžky väčšia ako nula, došlo k jednej alebo viacerým udalostiam.
Používame SIG_INT signálu (stlačte Ctrl + C) na ukončenie procesu. Keď stlačíte Ctrl + C, sig_handler () funkcia sa volá (podrobnosti nájdete v časti Spracovanie signálu). Táto funkcia odstráni deskriptor hodiniek, zatvorí inštanciu inotify fd, a ukončí program.
Záver
Inotify API môžete vo svojich vlastných aplikáciách na sledovanie, ladenie, automatizáciu a ďalšie používať používať svojským spôsobom. Tu sme videli priebeh vykonávania Inotify API.