So verwenden Sie die API in C -Sprache inotifizieren

So verwenden Sie die API in C -Sprache inotifizieren
Inotify ist eine Linux -API, die für die Überwachung von Dateisystemen verwendet wird.

In diesem Artikel wird angezeigt, wie inotify zur Verfolgung der Erstellung, Löschung oder Änderung von Dateien und Verzeichnissen des Linux -Dateisystems verwendet wird.

Befolgen Sie die folgenden Schritte, um eine bestimmte Datei oder ein bestimmtes Verzeichnis mithilfe von Inotify zu überwachen:

  1. Erstellen Sie eine Inotify -Instanz mit der Inotify_init ()
  2. Fügen Sie den vollständigen Pfad des Verzeichnisses oder die zu überwachende Datei und die Ereignisse hinzu, die Sie mit der Funktion beobachten sollen inotify_add_watch (). In derselben Funktion geben wir an, welche Ereignisse (beim Erstellen, auf Zugriff, auf Modify usw.), Änderungen an den Dateien oder Änderungen am Verzeichnis müssen überwacht werden.
  3. Warten Sie, bis Ereignisse auftreten, und lesen Sie den Puffer, der ein oder mehrere Ereignisse enthält, die mit dem aufgetreten sind lesen() oder wählen()
  4. Verarbeiten Sie das Ereignis, das aufgetreten ist, kehren Sie dann zu Schritt 3 zurück, um auf weitere Ereignisse zu warten, und wiederholen Sie.
  5. Entfernen Sie den Watch -Deskriptor mit dem inotify_rm_watch ()
  6. Schließen Sie die Inotify -Instanz.

Jetzt werden wir die Funktionen sehen, die zur Inotify -API verwendet werden.

Header-Datei: sys/inotify.H

Inotify_init () Funktion:

Syntax: int Inotify_init (void)

Argumente: Keine Argumente.

Rückgabewerte: Bei Erfolg gibt die Funktion einen neuen Dateideskriptor zurück, für den Fehler gibt die Funktion -1 zurück.

inotify_add_watch () Funktion:

Syntax: int inotify_add_watch (int fd, const char *pathname, uint32_t mask)

Argumente:

Diese Funktion erfordert drei Argumente.

Die 1st Argument (FD) ist ein Dateideskriptor, der sich auf die Inotify -Instanz bezieht (Rückgabewert von Inotify_init () Funktion) .

Die 2nd Das Argument ist Pfad des Verzeichnisses oder der Datei, die überwacht wird.

Der 3Rd Argument ist eine Bitmaske. Die Bitmaske repräsentiert die Ereignisse, die beobachtet werden. Wir können ein oder mehrere Ereignisse mit bitweise oder or ansehen.

Rückgabewerte: Bei Erfolg gibt die Funktion einen Watch -Deskriptor zurück, zum Fehler gibt die Funktion -1 zurück.

inotify_rm_watch () Funktion:

Syntax: int inotify_rm_watch (int fd, int32_t wd)

Argumente:

Diese Funktion nimmt zwei Argumente an.

Die 1st Argument (FD) ist ein Dateideskriptor, der sich auf die Inotify -Instanz bezieht (Rückgabewert von Inotify_init () Funktion) .

Die 2nd Argument (WD) ist ein Watch -Deskriptor (Rückgabewert von inotify_add_watch () Funktion) .

Rückgabewerte: Bei Erfolg kehrt die Funktion 0 zurück, für den Fehler kehrt die Funktion -1 zurück.

Wir gebrauchen lesen() Funktion (deklariert in Unistd.H Header Datei) zum Lesen des Puffer inotify_event Struktur. Der inotify_event Die Struktur wird in deklariert sys/inotify.H Header-Datei:

struct inotify_event
int32t wd;
uint32_t mask;
uint32_t Cookie;
uint32_t len;
Zeichenname [];

Der inotify_event Die Struktur stellt ein vom Inotify -System zurückgegebener Dateisystemereignis dar und enthält die folgenden Mitglieder:

  • wd: Watch Descriptor (Rückgabewert von inotify_add_watch () Funktion)
  • Maske: Eine Bitmaske, die alle Ereignisstypen enthält
  • Plätzchen: Eindeutige Zahl, die Ereignisse identifiziert
  • Len: Anzahl der Bytes im Feld Name
  • Name: Name der Datei oder des Verzeichnisses, in der das Ereignis aufgetreten ist

Im Folgenden finden Sie ein funktionierendes Beispiel: Verwenden der Inotify -API:

Inotifizieren.c Datei:

#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#include // Bibliothek für die FCNTL -Funktion
#define max_events 1024 /* Maximale Anzahl der zu verarbeitenden Ereignisse* /
#define len_name 16 /* unter der Annahme, dass die Länge des Dateinamens
Wird 16 Bytes nicht überschreiten*/
#define event_size (sizeof (struct inotify_event)) /*Größe eines Ereignisses* /
#define buf_len (max_events * (event_size + len_name))
/*Puffer, um die Daten der Ereignisse zu speichern*/
int fd, wd;
void sig_handler (int sig)
/* Schritt 5. Entfernen Sie den Watch -Deskriptor und schließen Sie die Inotify -Instanz*/
inotify_rm_watch (fd, wd);
schließen (fd);
exit (0);

int main (int argc, char ** argv)
char *path_to_be_watched;
Signal (SIGINT, SIG_Handler);
path_to_be_watched = argv [1];
/* Schritt 1. Initialisieren inotify */
fd = inotify_init ();
if (fcntl (fd, f_setfl, o_nonblock) < 0) // error checking for fcntl
Ausgang (2);
/* Schritt 2. Uhr hinzufügen */
wd = inotify_add_watch (fd, path_to_be_watched, in_modify | in_create | in_delete);
if (wd ==-1)
printf ("konnte nicht sehen: %s \ n", path_to_be_watched);

anders
printf ("Beobachten: %s \ n", path_to_be_watched);

während (1)
int i = 0, Länge;
char buffer [buf_len];
/* Schritt 3. Puffer lesen*/
Länge = read (fd, puffer, buf_len);
/* Schritt 4. Verarbeiten Sie die Ereignisse, die aufgetreten sind */
während ichstruct inotify_event *event = (struct inotify_event *) & buffer [i];
if (event-> len)
if (event-> mask & in_create)
if (event-> mask & in_isdir)
printf ("Das Verzeichnis %S wurde erstellt.\ n ", Ereignis-> Name);

anders
printf ("Die Datei %S wurde erstellt.\ n ", Ereignis-> Name);


sonst if (event-> mask & in_delete)
if (event-> mask & in_isdir)
printf ("Das Verzeichnis %S wurde gelöscht.\ n ", Ereignis-> Name);

anders
printf ("Die Datei %S wurde gelöscht.\ n ", Ereignis-> Name);


sonst if (event-> mask & in_modify)
if (event-> mask & in_isdir)
printf ("Das Verzeichnis %S wurde geändert.\ n ", Ereignis-> Name);

anders
printf ("Die Datei %S wurde geändert.\ n ", Ereignis-> Name);



i + = event_size + event-> len;


Ausgang:

Um das Programm auszuführen und die Ausgabe zu sehen, müssen wir zunächst zwei Terminals öffnen. Ein Terminal wird verwendet, um das Programm auszuführen Inotifizieren.C. Im zweiten Terminal gehen wir auf den Weg, der vom Inotify beobachtet wird.C. Wenn wir ein Verzeichnis oder eine Datei erstellen, eine Datei ändern oder ein Verzeichnis oder eine Datei löschen, werden diese auf dem ersten Terminal angezeigt.

Im Inotifizieren.C Beispiel die Unistd.H Die Header -Datei wird für die verwendet lesen() Und schließen() Funktion, die stdlib.H Die Header -Datei wird für die verwendet Ausfahrt() Funktion, die Signal.H Die Header -Datei wird für die verwendet Signal() Funktion und die Sig_int Makro (siehe Signalhandhabung für Details) und die fcntl.H Die Header -Datei wird für die verwendet fcntl () Funktion.

Wir erklären fd (Inotify -Instanz) und wd (Deskriptor ansehen) als globale Variablen, damit diese Variablen aus allen Funktionen zugänglich sind.

Der fcntl () Funktion wird so verwendet, dass beim Lesen der Verwendung der fd Deskriptor, der Thread wird nicht blockiert.

Als nächstes fügen wir eine Uhr mit dem hinzu inotify_add_watch () Funktion. Hier passieren wir FD, den Weg des Verzeichnisses, der beobachtet wird, und die Maske. Sie können die Maske der Ereignisse übergeben, die Sie mit Bitwise-OR überwachen möchten.

Lesen Sie nun den Puffer. Informationen zu einem oder mehreren Ereignissen werden im Puffer gespeichert. Sie können alle Ereignisse einzeln mit der Schleife verarbeiten. Sie können die Ereignis-> Maske überprüfen, um zu wissen, welche Art von Ereignissen stattgefunden haben.

Wir verwenden ein unendliches während der Schleife, um kontinuierlich zu überprüfen, wann Ereignisse aufgetreten sind. Wenn keine Ereignisse passiert sind, kehrt die Funktion read () mit einer 0 zurück. Der Rückgabewert der Funktion read () wird in der Längenvariablen gespeichert. Wenn der Wert der Längenvariablen größer als Null ist, sind ein oder mehrere Ereignisse aufgetreten.

Wir benutzen das Sig_int Signal (drücken Sie Strg+C), um aus dem Prozess zu beenden. Wenn Sie Strg+C drücken, die sig_handler () Die Funktion wird aufgerufen (siehe Signalhandling für Details). Diese Funktion entfernt den Watch -Deskriptor, schließt die Inotify -Instanz fd, und verlässt das Programm.

Abschluss

Sie können die API in Ihren eigenen Anwendungen zur Überwachung, Debuggierung, Automatisierung und mehr auf Ihre eigene Weise verwenden. Hier haben wir den Ausführungsfluss von Inotify API gesehen.