C Programování

Jak používat inotify API v jazyce C

Jak používat inotify API v jazyce C
Inotify je linuxové API používané pro monitorování událostí souborového systému.

Tento článek vám ukáže, jak se Inotify používá ke sledování vytváření, mazání nebo úprav souborů a adresářů souborového systému Linux.

Chcete-li pomocí Inotify sledovat konkrétní soubor nebo adresář, postupujte takto:

  1. Vytvořte instanci inotify pomocí inotify_init ()
  2. Přidejte úplnou cestu k adresáři nebo souboru, který chcete sledovat, a události, které chcete sledovat, pomocí této funkce inotify_add_watch (). Ve stejné funkci určíme, které události (ON CREATE, ON ACCESS, ON MODIFY atd.) je nutné sledovat změny souborů nebo změny v adresáři.
  3. Počkejte, až dojde k událostem, a přečtěte si vyrovnávací paměť, která obsahuje jednu nebo více událostí, ke kterým došlo, pomocí číst() nebo vybrat()
  4. Zpracujte událost, ke které došlo, poté se vraťte ke kroku 3, počkejte na další události, a opakujte.
  5. Odeberte deskriptor hodinek pomocí inotify_rm_watch ()
  6. Zavřete instanci inotify.

Nyní uvidíme funkce, které se používají pro Inotify API.

Soubor záhlaví: sys / inotify.h

inotify_init () funkce:

Syntaxe: int inotify_init (void)

Argumenty: Žádné argumenty.

Návratové hodnoty: Při úspěchu funkce vrací nový deskriptor souboru, při selhání funkce vrací -1.

inotify_add_watch () funkce:

Syntax: int inotify_add_watch (int fd, const char * cesta, maska ​​uint32_t)

Argumenty:

Tato funkce má tři argumenty.

1Svatý argument (fd) je deskriptor souboru, který odkazuje na instanci inotify (návratová hodnota inotify_init () funkce) .

2nd Argument je cesta sledovaného adresáře nebo souboru.

3rd argument je bitová maska. Bitová maska ​​představuje sledované události. Můžeme sledovat jednu nebo více událostí pomocí bitového operátoru OR.

Návratové hodnoty: Při úspěchu funkce vrátí deskriptor hodinek, při selhání funkce vrátí -1.

inotify_rm_watch () funkce:

Syntax: int inotify_rm_watch (int fd, int32_t wd)

Argumenty:

Tato funkce má dva argumenty.

1Svatý argument (fd) je deskriptor souboru, který odkazuje na instanci inotify (návratová hodnota inotify_init () funkce) .

2nd argument (wd) je deskriptor hodinek (návratová hodnota inotify_add_watch ()  funkce) .

Návratové hodnoty:  Při úspěchu funkce vrátí 0, při selhání funkce vrátí -1.

Používáme číst() funkce (deklarována v unistd.h záhlaví soubor) ke čtení vyrovnávací paměti, ve které jsou uloženy informace o událostech, ke kterým došlo ve formě inotify_event struktura. The inotify_event struktura je deklarována v sys / inotify.h hlavičkový soubor:

struct inotify_event
int32t wd;
maska ​​uint32_t;
uint32_t cookie;
uint32_t len;
char jméno [];

The inotify_event struktura představuje událost systému souborů vrácenou systémem inotify a obsahuje následující členy:

Níže je funkční příklad použití API Inotify:

Inotify.soubor c:

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout // knihovna pro funkci fcntl
 
#define MAX_EVENTS 1024 / * Maximální počet událostí ke zpracování * /
#define LEN_NAME 16 / * Za předpokladu, že délka názvu souboru
nepřekročí 16 bajtů * /
#define EVENT_SIZE (sizeof (struct inotify_event)) / * velikost jedné události * /
#define BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * vyrovnávací paměť pro ukládání dat událostí * /
 
int fd, wd;
 
void sig_handler (int sig)
 
/ * Krok 5. Odeberte deskriptor hodinek a zavřete instanci inotify * /
inotify_rm_watch (fd, wd);
zavřít (fd);
exit (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. Inicializovat inotify * /
fd = inotify_init ();
 
 
if (fcntl (fd, F_SETFL, O_NONBLOCK) < 0)  // error checking for fcntl
výstup (2);
 
/* Krok 2. Přidat hodinky * /
wd = inotify_add_watch (fd, path_to_be_watched, IN_MODIFY | IN_CREATE | IN_DELETE);
 
if (wd == - 1)
printf ("Nelze sledovat:% s \ n", path_to_be_watched);

jiný
printf ("Sledování:% s \ n", path_to_be_watched);

 
 
while (1)
 
int i = 0, délka;
char buffer [BUF_LEN];
 
/ * Krok 3. Číst vyrovnávací paměť * /
length = read (fd, buffer, BUF_LEN);
 
/ * Krok 4. Zpracovat události, ke kterým došlo * /
zatímco já 
struct inotify_event * event = (struct inotify_event *) & buffer [i];
 
if (event-> len)
if (event-> mask & IN_CREATE)
if (event-> mask & IN_ISDIR)
printf ("Byl vytvořen adresář% s.\ n ", událost-> jméno);

else
printf ("Soubor% s byl vytvořen.\ n ", událost-> jméno);


else if (event-> mask & IN_DELETE)
if (event-> mask & IN_ISDIR)
printf ("Adresář% s byl smazán.\ n ", událost-> jméno);

else
printf ("Soubor% s byl smazán.\ n ", událost-> jméno);


else if (event-> mask & IN_MODIFY)
if (event-> mask & IN_ISDIR)
printf ("Byl změněn adresář% s.\ n ", událost-> jméno);

else
printf ("Soubor% s byl změněn.\ n ", událost-> jméno);



i + = EVENT_SIZE + událost-> délka;


Výstup:

K provedení programu a zobrazení výstupu musíme nejprve otevřít dva terminály. Ke spuštění programu se používá jeden terminál Inotify.C. Ve druhém terminálu jdeme na cestu, kterou sleduje Inotify.C. Pokud vytvoříme libovolný adresář nebo soubor, upravíme libovolný soubor nebo odstraníme libovolný adresář nebo soubor, uvidíme je na prvním terminálu.

V Inotify.C příklad unistd.h záhlaví souboru se používá pro číst() a zavřít() funkce, stdlib.h záhlaví souboru se používá pro výstup() funkce, signál.h záhlaví souboru se používá pro signál() funkce a SIG_INT makro (podrobnosti viz Zpracování signálu) a fcntl.h záhlaví souboru se používá pro fcntl () funkce.

Prohlašujeme fd (instance inotify) a wd (deskriptor sledování) jako globální proměnné, aby tyto proměnné byly přístupné ze všech funkcí.

The fcntl () funkce se používá tak, že když čteme pomocí fd deskriptor, vlákno nebude blokováno.

Dále přidáme hodinky pomocí inotify_add_watch () funkce. Zde předáme fd, cestu k adresáři, který bude sledován, a masku. Masku událostí, které chcete sledovat, můžete předat pomocí bitového operátoru OR.

Nyní si přečtěte vyrovnávací paměť. Informace o jedné nebo více událostech jsou uloženy ve vyrovnávací paměti. Pomocí smyčky můžete zpracovávat všechny události jeden po druhém. Můžete zkontrolovat masku události-> a zjistit, jaký typ událostí se stal.

K nepřetržité kontrole výskytu událostí používáme nekonečnou smyčku while. Pokud nedošlo k žádným událostem, funkce read () se vrátí s 0. Návratová hodnota funkce read () je uložena v proměnné délky. Když je hodnota proměnné délky větší než nula, došlo k jedné nebo více událostem.

Používáme SIG_INT signál (stiskněte Ctrl + C) pro ukončení procesu. Když stisknete Ctrl + C, zobrazí se sig_handler () funkce se volá (podrobnosti viz Zpracování signálu). Tato funkce odebere deskriptor hodinek, zavře instanci inotify fd, a ukončí program.

Závěr

Inotify API můžete použít ve svých vlastních aplikacích pro monitorování, ladění, automatizaci a další, svým vlastním způsobem. Tady jsme viděli tok provádění Inotify API.

Hry Top 5 karet pro zachycení hry
Top 5 karet pro zachycení hry
Všichni jsme viděli a milovali streamování her na YouTube. PewDiePie, Jakesepticye a Markiplier jsou jen někteří z nejlepších hráčů, kteří vydělali mi...
Hry Jak vyvíjet hru na Linuxu
Jak vyvíjet hru na Linuxu
Před deseti lety by jen málo uživatelů Linuxu předpovídalo, že jejich oblíbený operační systém bude jednoho dne populární herní platformou pro komerčn...
Hry Porty komerčních her s otevřeným zdrojovým kódem
Porty komerčních her s otevřeným zdrojovým kódem
Zdarma, s otevřeným zdrojovým kódem a multiplatformní herní enginy lze hrát staré i některé z poměrně nedávných herních titulů. Tento článek uvede sez...