C Programmeerimine

Kuidas kasutada inotify API-d C-keeles

Kuidas kasutada inotify API-d C-keeles
Inotify on Linuxi API, mida kasutatakse failisüsteemi sündmuste jälgimiseks.

See artikkel näitab teile, kuidas Inotify-d kasutatakse Linuxi failisüsteemi failide ja kataloogide loomise, kustutamise või muutmise jälgimiseks.

Konkreetse faili või kataloogi jälgimiseks Inotify abil toimige järgmiselt

  1. Looge inotify-eksemplar, kasutades inotify_init ()
  2. Lisage funktsiooni abil kogu jälgitava kataloogi või faili tee ja jälgitavad sündmused inotify_add_watch (). Samas funktsioonis täpsustame, millised sündmused (LOOMISEL, JUURDEPÄÄSU JUURDE, MUUDETUSEL jne.), tuleb jälgida failide muudatusi või kataloogi muudatusi.
  3. Oodake sündmuste toimumist ja lugege puhvrit, mis sisaldab ühte või mitut toimunud sündmust, kasutades nuppu loe () või vali ()
  4. Töötlege toimunud sündmus, naaske 3. sammu juurde, et oodata rohkem sündmusi, ja korrake.
  5. Eemaldage kellakirjeldus, kasutades inotify_rm_watch ()
  6. Sulgege inotify-eksemplar.

Nüüd näeme funktsioone, mida kasutatakse Inotify API jaoks.

Päisefail: sys / inotify.h

inotify_init () funktsioon:

Süntaks: int inotify_init (void)

Argumendid: argumente pole.

Tagastusväärtused: õnnestumisel tagastab funktsioon uue failikirjeldaja, ebaõnnestumise korral funktsioon -1.

inotify_add_watch () funktsioon:

Süntaks: int inotify_add_watch (int fd, const char * tee nimi, uint32_t mask)

Argumendid:

Sellel funktsioonil on kolm argumenti.

1st argument (fd) on failikirjeldus, mis viitab inotify eksemplarile (tagastusväärtus inotify_init () funktsioon) .

2nd argument on jälgitava kataloogi või faili tee.

3rd argument on bitmask. Bitmask tähistab jälgitavaid sündmusi. Ühte või mitut sündmust saame vaadata bitipõhise OR abil.

Tagastusväärtused: Edukuse korral tagastab funktsioon vaatekirjelduse, ebaõnnestumise korral funktsioon -1.

inotify_rm_watch () funktsioon:

Süntaks: int inotify_rm_watch (int fd, int32_t wd)

Argumendid:

Sellel funktsioonil on kaks argumenti.

1st argument (fd) on failikirjeldus, mis viitab inotify eksemplarile (tagastatav väärtus inotify_init () funktsioon) .

2nd argument (wd) on vaatluse deskriptor (tagastusväärtus inotify_add_watch ()  funktsioon) .

Tagastusväärtused:  Edu korral tagastab funktsioon 0, ebaõnnestumise korral funktsioon -1.

Me kasutame loe () funktsioon (deklareeritud unistd.h päis fail) puhvri lugemiseks, kuhu salvestatakse teave sündmuste kohta inotify_event struktuur. The inotify_event struktuur deklareeritakse aastal sys / inotify.h päisefail:

struct inotify_event
int32t wd;
uint32_t mask;
uint32_t küpsis;
uint32_t len;
söe nimi [];

The inotify_event struktuur tähistab inotify süsteemi tagastatud failisüsteemi sündmust ja sisaldab järgmisi liikmeid:

Allpool on toimiv näide Inotify API abil:

Inotify.c-fail:

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
# kaasata // funktsiooni fcntl teek
 
#define MAX_EVENTS 1024 / * Töödeldavate sündmuste maksimaalne arv * /
#define LEN_NAME 16 / * Eeldades, et failinime pikkus
ei ületa 16 baiti * /
#define EVENT_SIZE (sizeof (struct inotify_event)) / * ühe sündmuse suurus * /
#define BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * puhver sündmuste andmete salvestamiseks * /
 
int fd, wd;
 
void sig_handler (int sig)
 
/ * 5. samm. Eemaldage kellakirjeldus ja sulgege inotify-eksemplar * /
inotify_rm_watch (fd, wd);
sulgema (fd);
väljumine (0);
 

 
 
int main (int argc, char ** argv)
 
 
char * tee_se_vaatama;
signaal (SIGINT, sig_handler);
 
tee_se_vaatatud = argv [1];
 
/* Samm 1. Inotiseeri initsialiseerimine * /
fd = inotify_init ();
 
 
kui (fcntl (fd, F_SETFL, O_NONBLOCK) < 0)  // error checking for fcntl
väljapääs (2);
 
/ * 2. samm. Lisa kell *
wd = inotify_add_watch (fd, tee_seni_valvatud, IN_MODIFY | IN_CREATE | IN_DELETE);
 
kui (wd == - 1)
printf ("Ei suutnud vaadata:% s \ n", tee_tuleb_vaatada);

veel
printf ("Vaatan:% s \ n", tee_se_vaatatud);

 
 
samas (1)
 
int i = 0, pikkus;
söepuhver [BUF_LEN];
 
/ * 3. samm. Lugemispuhver * /
pikkus = loetud (fd, puhver, BUF_LEN);
 
/ * 4. samm. Toimunud sündmuste töötlemine * /
kuni ma 
struct inotify_event * sündmus = (struct inotify_event *) & puhver [i];
 
kui (sündmus-> len)
kui (sündmus-> mask ja IN_CREATE)
kui (sündmus-> mask ja IN_ISDIR)
printf ("Loodi kataloog% s.\ n ", sündmus-> nimi);

veel
printf ("Fail% s loodi.\ n ", sündmus-> nimi);


else if (sündmus-> mask ja IN_DELETE)
kui (sündmus-> mask ja IN_ISDIR)
printf ("Kataloog% s kustutati.\ n ", sündmus-> nimi);

veel
printf ("Fail% s kustutati.\ n ", sündmus-> nimi);


else if (sündmus-> mask & IN_MODIFY)
kui (sündmus-> mask ja IN_ISDIR)
printf ("Kataloogi% s muudeti.\ n ", sündmus-> nimi);

veel
printf ("Faili% s muudeti.\ n ", sündmus-> nimi);



i + = EVENT_SIZE + sündmus-> len;


Väljund:

Programmi käivitamiseks ja väljundi nägemiseks peame kõigepealt avama kaks terminali. Programmi käivitamiseks kasutatakse ühte terminali Inotify.c. Teises terminalis läheme teele, mida Inotify jälgib.c. Kui loome kataloogi või faili, muudame faile või kustutame kataloogi või faili, näeme neid esimeses terminalis.

Aastal Inotify.c näiteks unistd.h päisefaili kasutatakse loe () ja Sulge() funktsioon stdlib.h päisefaili kasutatakse väljumine () funktsioon signaal.h päisefaili kasutatakse signaal() funktsioon ja SIG_INT makro (üksikasju vt signaali käsitlemisest) ja fcntl.h päisefaili kasutatakse fcntl () funktsioon.

Deklareerime fd (inotify instance) ja wd (watch deskriptor) globaalsete muutujatena, nii et nendele muutujatele oleks juurdepääs kõigist funktsioonidest.

The fcntl () funktsiooni kasutatakse nii, et kui loeme funktsiooni fd kirjeldaja, lõime ei blokeerita.

Järgmisena lisame kella kasutades inotify_add_watch () funktsioon. Siin läbime fd, vaadatava kataloogi tee ja maski. Bitt-OR abil saate edastada jälgitavate sündmuste maski.

Nüüd lugege puhvrit. Informatsioon ühe või mitme sündmuse kohta salvestatakse puhvrisse. Loopi abil saate kõiki sündmusi ükshaaval töödelda. Võite kontrollida sündmuse-> maski, et teada saada, mis tüüpi sündmusi on juhtunud.

Sündmuste pidevaks kontrollimiseks kasutame lõpmatut silmust. Kui ühtegi sündmust pole juhtunud, naaseb funktsioon read () väärtusega 0. Funktsiooni read () tagastusväärtus salvestatakse pikkuse muutujasse. Kui pikkuse muutuja väärtus on suurem kui null, on toimunud üks või mitu sündmust.

Me kasutame SIG_INT signaal (vajutage Ctrl + C) protsessist väljumiseks. Kui vajutate klahvikombinatsiooni Ctrl + C, sig_handler () funktsiooni nimetatakse (üksikasju vt signaali käsitsemisest). See funktsioon eemaldab kella kirjeldaja, sulgeb inotify-eksemplari fd, ja väljub programmist.

Järeldus

Inotify API-d saate omal moel kasutada jälgimiseks, silumiseks, automatiseerimiseks ja muuks. Siin oleme näinud Inotify API käivitamise voogu.

Kuidas mängu Linuxis arendada
Kümme aastat tagasi ei osanud paljud Linuxi kasutajad ennustada, et nende lemmikoperatsioonisüsteem on ühel päeval populaarne kommertsvideomängude män...
Kommertsmängumootorite avatud lähtekoodiga sadamad
Tasuta, avatud lähtekoodiga ja platvormidevaheliste mängumootorite puhkusereise saab kasutada nii vanade kui ka mõnede üsna hiljutiste mängude pealkir...
Parimad Linuxi käsurea mängud
Käsurida pole Linuxi kasutamisel lihtsalt teie suurim liitlane - see võib olla ka meelelahutusallikas, sest saate seda kasutada paljude lõbusate mängu...