C programavimas

Kaip naudoti inotify API C kalba

Kaip naudoti inotify API C kalba
„Inotify“ yra „Linux“ API, naudojama failų sistemos įvykių stebėjimui.

Šis straipsnis parodys, kaip „Inotify“ naudojama stebint „Linux“ failų sistemos failų ir katalogų kūrimą, ištrynimą ar modifikavimą.

Norėdami stebėti konkretų failą ar katalogą naudodami „Inotify“, atlikite šiuos veiksmus:

  1. Sukurkite inotify egzempliorių naudodami inotify_init ()
  2. Naudodami šią funkciją pridėkite visą stebimo katalogo ar failo kelią ir stebimus įvykius inotify_add_watch (). Toje pačioje funkcijoje mes nurodome, kurie įvykiai (KŪRIMO, PRIEIGOS, KEITIMO IR kt.).), failų ar katalogo pakeitimus reikia stebėti.
  3. Palaukite, kol įvykiai įvyks, ir naudodami., Perskaitykite buferį, kuriame yra vienas ar daugiau įvykių skaityti () arba pasirinkti ()
  4. Apdorokite įvykį, tada grįžkite prie 3 veiksmo, kad palauktumėte daugiau įvykių, ir pakartokite.
  5. Pašalinkite laikrodžio aprašą naudodami inotify_rm_watch ()
  6. Uždarykite inotify egzempliorių.

Dabar pamatysime funkcijas, kurios naudojamos „Inotify API“.

Antraštės failas: sys / inotify.h

inotify_init () funkcija :

Sintaksė: int inotify_init (negaliojanti)

Argumentai: argumentų nėra.

Grąžinimo vertės: pasisekus, funkcija grąžina naują failo deskriptorių, jei nepavyksta, funkcija grąžina -1.

inotify_add_watch () funkcija:

Sintaksė: int inotify_add_watch (int fd, const char * kelio pavadinimas, uint32_t kaukė)

Argumentai:

Šiai funkcijai reikia trijų argumentų.

1šv argumentas (fd) yra failo aprašas, nurodantis inotify egzempliorių ( inotify_init () funkcija) .

2nd argumentas yra stebimo katalogo ar failo kelias.

3rd argumentas yra bitmaskas. „Bitmask“ reiškia įvykius, kuriuos žiūrite. Vieną ar daugiau įvykių galime stebėti naudodami „bitwise-OR“.

Grąžinimo vertės: Pasisekus, funkcija pateikia stebėjimo aprašą, o nesėkmės atveju - -1.

inotify_rm_watch () funkcija:

Sintaksė: int inotify_rm_watch (int fd, int32_t wd)

Argumentai:

Šiai funkcijai reikia dviejų argumentų.

1šv argumentas (fd) yra failo aprašas, nurodantis inotify egzempliorių ( inotify_init () funkcija) .

2nd argumentas (wd) yra laikrodžio aprašas (grąžinama vertė inotify_add_watch ()  funkcija) .

Grąžinimo vertės:  Pasisekus, funkcija grąžina 0, nesėkmės atveju - -1.

Mes naudojame skaityti () funkcija (deklaruota 2005 m.) unistd.h antraštė failas), kad būtų galima perskaityti buferį, kuriame saugoma įvykių, įvykusių, forma inotify_event struktūra. The inotify_event struktūra yra deklaruota sys / inotify.h antraštės failas:

struct inotify_event
int32t wd;
uint32_t kaukė;
uint32_t slapukas;
uint32_t len;
chario vardas [];

The inotify_event struktūra reiškia failų sistemos įvykį, kurį grąžino inotify sistema, ir jame yra šie nariai:

Toliau pateikiamas veikiantis pavyzdys, naudojant „Inotify“ API:

Inotify.c failas:

# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti // fcntl funkcijos biblioteka
 
#define MAX_EVENTS 1024 / * Didžiausias apdorojamų įvykių skaičius * /
#define LEN_NAME 16 / * Darant prielaidą, kad failo vardo ilgis
neviršys 16 baitų * /
#define EVENT_SIZE (sizeof (struct inotify_event)) / * vieno įvykio dydis * /
#define BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * buferis įvykių duomenims saugoti * /
 
int fd, wd;
 
negaliojantis sig_handler (int sig)
 
/ * 5 žingsnis. Pašalinkite laikrodžio aprašą ir uždarykite inotify egzempliorių * /
inotify_rm_watch (fd, wd);
uždaryti (fd);
išėjimas (0);
 

 
 
int main (int argc, char ** argv)
 
 
char * path_to_be_watched;
signalas (SIGINT, sig_handler);
 
path_to_be_watched = argv [1];
 
/* 1 žingsnis. Inicijuoti inotify * /
fd = inotify_init ();
 
 
jei (fcntl (fd, F_SETFL, O_NONBLOCK) < 0)  // error checking for fcntl
išėjimas (2);
 
/* 2 žingsnis. Pridėti laikrodį * /
wd = inotify_add_watch (fd, path_to_be_watched, IN_MODIFY | IN_CREATE | IN_DELETE);
 
jei (wd == - 1)
printf ("Nepavyko žiūrėti:% s \ n", kelias_būti_žiūrėtas);

Kitas
printf ("Žiūrėti:% s \ n", kelias_būti_žiūrėtas);

 
 
o (1)
 
int i = 0, ilgis;
char buferis [BUF_LEN];
 
/ * 3 žingsnis. Skaitymo buferis * /
ilgis = skaityti (fd, buferis, BUF_LEN);
 
/ * 4 žingsnis. Apdorokite įvykius, kurie įvyko * /
kol aš 
struct inotify_event * įvykis = (struct inotify_event *) & buferis [i];
 
jei (įvykis-> len)
jei (įvykis-> kaukė ir IN_CREATE)
jei (įvykis-> kaukė ir IN_ISDIR)
printf ("Sukurtas katalogas% s.\ n ", įvykis-> vardas);

Kitas
printf ("Failas% s buvo sukurtas.\ n ", įvykis-> vardas);


else if (įvykis-> kaukė ir IN_DELETE)
jei (įvykis-> kaukė ir IN_ISDIR)
printf ("Katalogas% s buvo ištrintas.\ n ", įvykis-> vardas);

Kitas
printf ("Failas% s buvo ištrintas.\ n ", įvykis-> vardas);


else if (įvykis-> kaukė ir IN_MODIFY)
jei (įvykis-> kaukė ir IN_ISDIR)
printf ("Katalogas% s buvo modifikuotas.\ n ", įvykis-> vardas);

Kitas
printf ("Failas% s buvo pakeistas.\ n ", įvykis-> vardas);



i + = EVENT_SIZE + įvykis-> len;


Išvestis:

Norėdami vykdyti programą ir pamatyti išvestį, pirmiausia turime atidaryti du gnybtus. Programai paleisti naudojamas vienas terminalas Inotify.c. Antrame terminale einame keliu, kurį stebi „Inotify“.c. Jei sukursime bet kurį katalogą ar failą, modifikuosime bet kurį failą arba ištrinsime bet kurį katalogą ar failą, juos pamatysime pirmajame terminale.

Viduje konors Inotify.c pavyzdys unistd.h antraštės failas naudojamas skaityti () ir Uždaryti() funkcija stdlib.h antraštės failas naudojamas išėjimas () funkcija signalas.h antraštės failas naudojamas signalas () funkcija ir SIG_INT makrokomanda (daugiau informacijos žr. Signalų apdorojimas) ir fcntl.h antraštės failas naudojamas fcntl () funkcija.

Mes deklaruojame fd (nenurodykite pavyzdžio) ir wd (laikrodžio aprašas) kaip visuotiniai kintamieji, kad šie kintamieji būtų prieinami iš visų funkcijų.

The fcntl () funkcija naudojama taip, kad kai mes skaitome naudodami fd deskriptorius, gija nebus užblokuota.

Tada pridedame laikrodį naudodami inotify_add_watch () funkcija. Čia mes praleidžiame fd, aplankomo katalogo kelią ir kaukę. Galite perduoti įvykių, kuriuos norite stebėti, kaukę naudodami „bitwise-OR“.

Dabar perskaitykite buferį. Informacija apie vieną ar daugiau įvykių yra saugoma buferyje. Visus įvykius galite apdoroti po vieną naudodami kilpą. Galite patikrinti įvykio-> kaukę, kad sužinotumėte, kokio tipo įvykiai įvyko.

Mes naudojame begalinį ciklą, kad galėtume nuolat tikrinti įvykių įvykius. Jei neįvyko įvykių, funkcija read () grąžinama su 0. Grąžinimo funkcija read () yra saugoma ilgio kintamajame. Kai ilgio kintamojo vertė yra didesnė nei nulis, įvyko vienas ar daugiau įvykių.

Mes naudojame SIG_INT signalą (paspauskite Ctrl + C), kad išeitumėte iš proceso. Kai paspausite „Ctrl“ + C, sig_handler () vadinama funkcija (išsamesnės informacijos ieškokite signalo tvarkyme). Ši funkcija pašalina laikrodžio aprašą, uždaro inotify egzempliorių fd, ir išeina iš programos.

Išvada

„Inotify“ API galite naudoti savo programose, kad galėtumėte stebėti, derinti, automatizuoti ir dar daugiau. Čia matėme „Inotify“ API vykdymo eigą.

Kaip parodyti FPS skaitiklį „Linux“ žaidimuose
„Linux“ žaidimai gavo didelį postūmį, kai „Valve“ paskelbė „Linux“ palaikymą „Steam“ klientui ir jų žaidimams 2012 m. Nuo tada daugelis AAA ir indie ž...
Kaip atsisiųsti ir paleisti „Sid Meier Civilization VI“ sistemoje „Linux“
Įvadas į žaidimą „Civilization 6“ yra šiuolaikinė klasikinės koncepcijos, pristatytos „Age of Empires“ žaidimų serijoje, koncepcija. Idėja buvo gana p...
Kaip įdiegti ir žaisti „Doom“ sistemoje „Linux“
Įvadas į Doom „Doom“ serija atsirado 90-aisiais, išleidus originalų „Doom“. Tai buvo tiesioginis hitas, o nuo to laiko žaidimų serija gavo daugybę apd...