C Programovanie

Ako používať inotify API v jazyku C

Ako používať inotify API v jazyku C
Inotify je Linux API používané na monitorovanie udalostí súborového systému.

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:

  1. Vytvorte inštanciu inotify pomocou inotify_init ()
  2. 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.
  3. Počkajte, kým sa vyskytnú udalosti, a pomocou príkazu čítať() alebo vyberte ()
  4. Spracujte udalosť, ku ktorej došlo, potom sa vráťte ku kroku 3, počkajte na ďalšie udalosti, a opakujte.
  5. Odstráňte deskriptor hodiniek pomocou inotify_rm_watch ()
  6. 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_event
int32t 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:

Nasleduje funkčný príklad použitia rozhrania Inotify API:

Inotifikovať.súbor c:

#include
#include
#include
#include
#include
#include // knižnica pre funkciu fcntl
 
#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.

Hry Ako nainštalovať League Of Legends na Ubuntu 14.04
Ako nainštalovať League Of Legends na Ubuntu 14.04
Ak ste fanúšikom League of Legends, potom je to pre vás príležitosť otestovať spustenie League of Legends. Upozorňujeme, že program PlayOnLinux podpor...
Hry Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
OpenRA je herný engine Libre / Free Real Time Strategy, ktorý obnovuje rané hry z Westwoodu, ako napríklad klasické Command & Conquer: Red Alert. Dist...
Hry Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Emulátor Dolphin vám umožní hrať vybrané hry Gamecube a Wii na osobných počítačoch Linux (PC). Emulátor Dolphin, ktorý je voľne dostupným emulátorom ...