C Programiranje

Kako koristiti API za inotifikaciju na jeziku C

Kako koristiti API za inotifikaciju na jeziku C
Inotify je Linux API koji se koristi za praćenje događaja datotečnog sustava.

Ovaj će vam članak pokazati kako se Inotify koristi za praćenje stvaranja, brisanja ili modificiranja datoteka i direktorija Linux datotečnog sustava.

Da biste nadzirali određenu datoteku ili direktorij pomoću Inotify, slijedite ove korake:

  1. Stvorite inotificiranu instancu pomoću inotify_init ()
  2. Dodajte punu putanju direktorija ili datoteke za praćenje i događaje za praćenje pomoću funkcije inotify_add_watch (). U istoj funkciji određujemo koji događaji (ON CREATE, ON ACCESS, ON MODIFY itd.), promjene na datotekama ili promjene u direktoriju moraju se nadzirati.
  3. Pričekajte da se dogode događaji i pročitajte međuspremnik koji sadrži jedan ili više događaja koji su se dogodili pomoću čitati() ili Odaberi()
  4. Obradite događaj koji se dogodio, a zatim se vratite na korak 3 da pričekate još događaja i ponovite.
  5. Uklonite deskriptor sata pomoću inotify_rm_watch ()
  6. Zatvorite instancu inotify.

Sada ćemo vidjeti funkcije koje se koriste za Inotify API.

Datoteka zaglavlja: sys / inotificirati.h

inotify_init () funkcija:

Sintaksa: int inotify_init (void)

Argumenti: Nema argumenata.

Povratne vrijednosti: Nakon uspjeha funkcija vraća novi deskriptor datoteke, u slučaju neuspjeha funkcija vraća -1.

inotify_add_watch () funkcija:

Sintaksa: int inotify_add_watch (int fd, const char * ime puta, maska ​​uint32_t)

Argumenti:

Ova funkcija uzima tri argumenta.

1sv argument (fd) je deskriptor datoteke koji se odnosi na instancu inotify (povratna vrijednost inotify_init () funkcija) .

2nd argument je staza direktorija ili datoteke koja se nadgleda.

3rd argument je bitna maska. Bitmaska ​​predstavlja događaje koji se gledaju. Možemo gledati jedan ili više događaja pomoću bit-OR.

Povratne vrijednosti: U uspjehu funkcija vraća deskriptor promatranja, a u slučaju neuspjeha funkcija vraća -1.

inotify_rm_watch () funkcija:

Sintaksa: int inotify_rm_watch (int fd, int32_t wd)

Argumenti:

Ova funkcija uzima dva argumenta.

1sv argument (fd) je deskriptor datoteke koji se odnosi na instancu inotify (povratna vrijednost inotify_init () funkcija) .

2nd argument (wd) je deskriptor sata (povratna vrijednost inotify_add_watch ()  funkcija) .

Povratne vrijednosti:  U uspjehu funkcija vraća 0, a u slučaju neuspjeha funkcija vraća -1.

Koristimo čitati() funkcija (deklarirana u unistd.h Zaglavlje datoteka) za čitanje međuspremnika, u kojem su pohranjene informacije o događajima koji su se dogodili u obliku inotify_event struktura. The inotify_event struktura je deklarirana u sys / inotificirati.h datoteka zaglavlja:

struct inotify_event
int32t wd;
maska ​​uint32_t;
uint32_t kolačić;
uint32_t len;
naziv char [];

The inotify_event struktura predstavlja događaj datotečnog sustava koji je vratio sustav inotify i sadrži sljedeće članove:

Ispod je radni primjer korištenja API-ja Inotify:

Obavijestiti.c datoteka:

#include
#include
#include
#include
#include
#include // biblioteka za funkciju fcntl
 
#define MAX_EVENTS 1024 / * Maksimalan broj događaja za obradu * /
#define LEN_NAME 16 / * Pod pretpostavkom da je duljina naziva datoteke
neće premašiti 16 bajtova * /
#define EVENT_SIZE (sizeof (struct inotify_event)) / * veličina jednog događaja * /
#define BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * međuspremnik za pohranu podataka o događajima * /
 
int fd, wd;
 
void sig_handler (int sig)
 
/ * Korak 5. Uklonite opis sata i zatvorite instancu inotify * /
inotify_rm_watch (fd, wd);
zatvoriti (fd);
izlaz (0);
 

 
 
int main (int argc, char ** argv)
 
 
char * put_do_be_gledati;
signal (SIGINT, sig_handler);
 
path_to_be_watched = argv [1];
 
/* Korak 1. Inicijalizirajte inotificiranje * /
fd = inotify_init ();
 
 
if (fcntl (fd, F_SETFL, O_NONBLOCK)) < 0)  // error checking for fcntl
izlaz (2);
 
/* Korak 2. Dodaj sat * /
wd = inotify_add_watch (fd, path_to_be_watched, IN_MODIFY | IN_CREATE | IN_DELETE);
 
ako (wd == - 1)
printf ("Ne mogu gledati:% s \ n", put_do_be_gledanih);

drugo
printf ("Gledanje:% s \ n", put_do_be_gledanih);

 
 
dok (1)
 
int i = 0, duljina;
međuspremnik znakova [BUF_LEN];
 
/ * Korak 3. Me uspremnik za čitanje * /
duljina = čitanje (fd, međuspremnik, BUF_LEN);
 
/ * Korak 4. Obradite događaje koji su se dogodili * /
dok ja 
struct inotify_event * događaj = (struct inotify_event *) & buffer [i];
 
if (event-> len)
if (event-> mask & IN_CREATE)
if (event-> mask & IN_ISDIR)
printf ("Direktorij% s je stvoren.\ n ", događaj-> ime);

inače
printf ("Datoteka% s je stvorena.\ n ", događaj-> ime);


inače ako (događaj-> maska ​​& IN_DELETE)
if (event-> mask & IN_ISDIR)
printf ("Direktorij% s je izbrisan.\ n ", događaj-> ime);

inače
printf ("Datoteka% s je izbrisana.\ n ", događaj-> ime);


inače ako (event-> mask & IN_MODIFY)
if (event-> mask & IN_ISDIR)
printf ("Direktorij% s je izmijenjen.\ n ", događaj-> ime);

inače
printf ("Datoteka% s je izmijenjena.\ n ", događaj-> ime);



i + = EVENT_SIZE + događaj-> len;


Izlaz:

Da bismo izvršili program i vidjeli izlaz, prvo moramo otvoriti dva terminala. Za pokretanje programa koristi se jedan terminal Obavijestiti.c. U drugom terminalu idemo na put koji promatra Inotify.c. Ako kreiramo bilo koji direktorij ili datoteku, izmijenimo bilo koju datoteku ili izbrišemo bilo koji direktorij ili datoteku, vidjet ćemo ih na prvom terminalu.

U Obavijestiti.c primjer, unistd.h datoteka zaglavlja koristi se za čitati() i Zatvoriti() funkcija, stdlib.h datoteka zaglavlja koristi se za Izlaz() funkcija, signal.h datoteka zaglavlja koristi se za signal() funkcija i SIG_INT makronaredba (za detalje pogledajte Upravljanje signalom) i fcntl.h datoteka zaglavlja koristi se za fcntl () funkcija.

Izjavljujemo F D (inotificirati instancu) i wd (watch deskriptor) kao globalne varijable tako da su tim varijablama dostupne sve funkcije.

The fcntl () funkcija koristi se tako da kada čitamo pomoću F D deskriptor, nit neće biti blokiran.

Dalje, dodajemo sat pomoću inotify_add_watch () funkcija. Ovdje prolazimo fd, put direktorija koji će se gledati i masku. Možete proslijediti masku događaja koje želite pratiti pomoću bit-OR.

Sada pročitajte međuspremnik. Podaci o jednom ili više događaja pohranjuju se u međuspremnik. Sve događaje možete obraditi jedan po jedan pomoću petlje. Možete provjeriti event-> masku kako biste znali koja se vrsta događaja dogodila.

Koristimo beskonačnu petlju while za kontinuiranu provjeru kada su se događaji dogodili. Ako se nije dogodio nijedan događaj, funkcija read () vraća se s 0. Povratna vrijednost funkcije read () pohranjuje se u varijablu dužine. Kad je vrijednost varijable dužine veća od nule, dogodio se jedan ili više događaja.

Koristimo SIG_INT signal (pritisnite Ctrl + C) da biste izašli iz procesa. Kada pritisnete Ctrl + C, tipka sig_handler () poziva se funkcija (za detalje pogledajte Upravljanje signalom). Ova funkcija uklanja deskriptor sata, zatvara instancu inotify F D, i izlazi iz programa.

Zaključak

API Inotify možete koristiti u vlastitim aplikacijama za praćenje, ispravljanje pogrešaka, automatizaciju i još mnogo toga, na svoj način. Ovdje smo vidjeli tijek izvršavanja API-ja Inotify.

Vodič za Shadow of the Tomb Raider za Linux
Shadow of the Tomb Raider dvanaesti je dodatak seriji Tomb Raider - franšizi u akcijsko-avanturističkoj igri koju je stvorio Eidos Montreal. I kritiča...
Kako pojačati FPS u Linuxu?
FPS je kratica Okviri u sekundi. Zadatak FPS-a je mjerenje broja sličica u reprodukcijama video zapisa ili igranim izvedbama. Jednostavnim riječima, b...
Najpopularnije laboratorijske igre Oculus App
Ako ste vlasnik slušalica Oculus, tada morate biti sigurni u bočno učitavanje. Bočno učitavanje postupak je instaliranja nehranjenog sadržaja na vaše ...