C Programmēšana

Kā izmantot inotify API C valodā

Kā izmantot inotify API C valodā
Inotify ir Linux API, ko izmanto failu sistēmas notikumu uzraudzībai.

Šis raksts parādīs, kā Inotify tiek izmantots, lai izsekotu Linux failu sistēmas failu un direktoriju izveidi, dzēšanu vai modificēšanu.

Lai uzraudzītu noteiktu failu vai direktoriju, izmantojot Inotify, rīkojieties šādi:

  1. Izveidojiet inotify gadījumu, izmantojot inotify_init ()
  2. Izmantojot funkciju, pievienojiet pilnu direktorija vai faila, kuru vēlaties uzraudzīt, un skatāmo notikumu ceļu inotify_add_watch (). Tajā pašā funkcijā mēs norādām, kuri notikumi (CREATE, ON ACCESS, ON MODIFY utt.).), ir jāuzrauga izmaiņas failos vai izmaiņas direktorijā.
  3. Gaidiet notikumu rašanos un izlasiet buferi, kurā ir viens vai vairāki notikumi, izmantojot lasīt () vai atlasīt ()
  4. Apstrādājiet notikušo notikumu, pēc tam atgriezieties pie 3. darbības, lai gaidītu citus notikumus, un atkārtojiet.
  5. Noņemiet pulksteņa deskriptoru, izmantojot inotify_rm_watch ()
  6. Aizveriet inotify instanci.

Tagad mēs redzēsim funkcijas, kas tiek izmantotas Inotify API.

Galvenes fails: sys / inotify.h

inotify_init () funkcija:

Sintakse: int inotify_init (void)

Argumenti: bez argumentiem.

Atgriešanas vērtības: pēc panākumiem funkcija atgriež jaunu faila deskriptoru, ja neveiksmes gadījumā funkcija atgriež -1.

inotify_add_watch () funkcija:

Sintakse: int inotify_add_watch (int fd, const char * ceļa nosaukums, uint32_t maska)

Argumenti:

Šai funkcijai nepieciešami trīs argumenti.

1sv arguments (fd) ir faila deskriptors, kas norāda uz inotify instanci (atgriežamā vērtība inotify_init () funkcija) .

2nd arguments ir uzraudzītā direktorija vai faila ceļš.

3rd arguments ir bitmasks. Bitmasks attēlo notikumus, kurus vēro. Mēs varam noskatīties vienu vai vairākus notikumus, izmantojot bitwise-OR.

Atgriešanas vērtības: Pēc panākumiem funkcija atgriež pulksteņa deskriptoru, ja neveiksmes gadījumā funkcija atgriež -1.

inotify_rm_watch () funkcija:

Sintakse: int inotify_rm_watch (int fd, int32_t wd)

Argumenti:

Šai funkcijai nepieciešami divi argumenti.

1sv arguments (fd) ir faila deskriptors, kas attiecas uz inotify instanci (atgriežamā vērtība inotify_init () funkcija) .

2nd arguments (wd) ir skatīšanās deskriptors (atgriešanās vērtība inotify_add_watch ()  funkcija) .

Atgriešanās vērtības:  Pēc panākumiem funkcija atgriež 0, neveiksmes gadījumā funkcija -1.

Mēs izmantojam lasīt () funkcija (deklarēta unistd.h galveni fails), lai nolasītu buferi, kurā tiek saglabāta informācija par notikušajiem notikumiem inotify_event struktūru. The inotify_event struktūra ir deklarēta sys / inotify.h galvenes fails:

struct inotify_event
int32t wd;
uint32_t maska;
uint32_t sīkdatne;
uint32_t len;
char nosaukums [];

The inotify_event struktūra attēlo failu sistēmas notikumu, ko atgriezusi inotify sistēma, un tajā ir šādi dalībnieki:

Tālāk ir sniegts piemērs, izmantojot Inotify API:

Inotify.c fails:

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut // fcntl funkcijas bibliotēka
 
#define MAX_EVENTS 1024 / * Maksimālais apstrādājamo notikumu skaits * /
#define LEN_NAME 16 / * Pieņemot, ka faila nosaukuma garums
nepārsniegs 16 baitus * /
#define EVENT_SIZE (sizeof (struct inotify_event)) / * viena notikuma lielums * /
#define BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * buferis, lai saglabātu notikumu datus * /
 
int fd, wd;
 
void sig_handler (int sig)
 
/ * 5. solis. Noņemiet pulksteņa deskriptoru un aizveriet inotify instanci * /
inotify_rm_watch (fd, wd);
aizvērt (fd);
izeja (0);
 

 
 
int main (int argc, char ** argv)
 
 
char * path_to_be_watched;
signāls (SIGINT, sig_handler);
 
path_to_be_watched = argv [1];
 
/ * 1. darbība. Inicializēt inotify * /
fd = inotify_init ();
 
 
ja (fcntl (fd, F_SETFL, O_NONBLOCK) < 0)  // error checking for fcntl
izeja (2);
 
/ * 2. solis. Pievienot skatīties * /
wd = inotify_add_watch (fd, path_to_be_watched, IN_MODIFY | IN_CREATE | IN_DELETE);
 
ja (wd == - 1)
printf ("Nevarēja skatīties:% s \ n", ceļš_uz_uzraudzīties);

cits
printf ("Skatīties:% s \ n", ceļš_uz_uzraudzīties);

 
 
kamēr (1)
 
int i = 0, garums;
char buferis [BUF_LEN];
 
/ * 3. solis. Lasīt buferi * /
garums = nolasīts (fd, buferis, BUF_LEN);
 
/ * 4. solis. Apstrādāt notikušos notikumus * /
kamēr es 
struct inotify_event * event = (struct inotify_event *) & buferis [i];
 
ja (notikums-> len)
ja (notikums-> maska ​​un IN_CREATE)
ja (notikums-> maska ​​un IN_ISDIR)
printf ("Tika izveidota direktorija% s.\ n ", notikums-> nosaukums);

cits
printf ("Tika izveidots fails% s.\ n ", notikums-> nosaukums);


cits, ja (notikums-> maska ​​un IN_DELETE)
ja (notikums-> maska ​​un IN_ISDIR)
printf ("Tika izdzēsta direktorija% s.\ n ", notikums-> nosaukums);

cits
printf ("Fails% s tika izdzēsts.\ n ", notikums-> nosaukums);


else if (notikums-> maska ​​un IN_MODIFY)
ja (notikums-> maska ​​un IN_ISDIR)
printf ("Tika mainīts katalogs% s.\ n ", notikums-> nosaukums);

cits
printf ("Fails% s tika modificēts.\ n ", notikums-> nosaukums);



i + = EVENT_SIZE + notikums-> len;


Izeja:

Lai izpildītu programmu un redzētu izeju, vispirms mums jāatver divi termināļi. Programmas darbināšanai tiek izmantots viens terminālis Inotify.c. Otrajā terminālī mēs ejam uz taku, kuru vēro Inotify.c. Ja mēs izveidosim jebkuru direktoriju vai failu, pārveidosim jebkuru failu vai izdzēsīsim jebkuru direktoriju vai failu, mēs tos redzēsim pirmajā terminālā.

Iekš Inotify.c piemērs unistd.h galvenes fails tiek izmantots lasīt () un aizvērt () funkcija, stdlib.h galvenes fails tiek izmantots Izeja() funkcija, signāls.h galvenes fails tiek izmantots signāls () funkcija un SIG_INT makro (sīkāku informāciju skatiet signālu apstrādē) un fcntl.h galvenes fails tiek izmantots fcntl () funkciju.

Mēs paziņojam fd (neinformēt instanci) un wd (watch deskriptor) kā globālos mainīgos, lai šie mainīgie būtu pieejami no visām funkcijām.

The fcntl () funkcija tiek izmantota tā, lai, lasot, izmantojot fd deskriptors, pavediens netiks bloķēts.

Pēc tam mēs pievienojam pulksteni, izmantojot inotify_add_watch () funkciju. Šeit mēs ejam garām fd, skatāmā direktorija ceļu un masku. Jūs varat nodot to notikumu masku, kurus vēlaties pārraudzīt, izmantojot bitu-OR.

Tagad izlasiet buferi. Informācija par vienu vai vairākiem notikumiem tiek saglabāta buferī. Izmantojot cilpu, visus notikumus var apstrādāt pa vienam. Jūs varat pārbaudīt notikumu-> masku, lai uzzinātu, kāda veida notikumi ir notikuši.

Mēs nepārtraukti pārbaudām, kad notika notikumi, mēs izmantojam bezgalīgu ciklu. Ja notikumi nav notikuši, funkcija read () atgriežas ar 0. Funkcijas read () atgriešanās vērtība tiek saglabāta garuma mainīgajā. Kad garuma mainīgā vērtība ir lielāka par nulli, ir noticis viens vai vairāki notikumi.

Mēs izmantojam SIG_INT signālu (nospiediet Ctrl + C), lai izietu no procesa. Nospiežot Ctrl + C, sig_handler () tiek izsaukta funkcija (sīkāku informāciju skatiet signālu apstrādē). Šī funkcija noņem pulksteņa deskriptoru, aizver inotify instanci fd, un iziet no programmas.

Secinājums

Inotify API varat izmantot savās lietojumprogrammās, lai pārraudzītu, atkļūdotu, automatizētu un daudz ko citu. Šeit mēs esam redzējuši Inotify API izpildes plūsmu.

Labākās Linux spēļu gamepad kartēšanas lietotnes
Ja jums patīk spēlēt spēles Linux ar parastu tastatūru, nevis parasto tastatūru un peles ievades sistēmu, jums ir dažas noderīgas lietotnes. Daudzas d...
Noderīgi rīki Linux spēlētājiem
Ja jums patīk spēlēt spēles Linux, iespējams, ka spēļu pieredzes uzlabošanai, iespējams, esat izmantojis tādas lietotnes un utilītprogrammas kā Wine, ...
HD Remastered spēles operētājsistēmai Linux, kurām nekad agrāk nebija Linux laidiena
Daudzi spēļu izstrādātāji un izdevēji nāk klajā ar veco spēļu HD remaster, lai pagarinātu franšīzes darbības laiku. Lūdzu, faniem, kas pieprasa saderī...