GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verwendet man inotify richtig?

Unten ist ein Ausschnitt, wie Sie inotify verwenden können, um "aaa" zu sehen. Beachten Sie, dass ich das nicht getestet habe, ich habe es nicht einmal kompiliert! Sie müssen eine Fehlerprüfung hinzufügen.

Anstelle eines blockierenden Lesens können Sie auch poll/select auf inotfd verwenden.

const char *filename = "aaa";
int inotfd = inotify_init();

int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY);

size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = malloc(bufsiz);

/* wait for an event to occur */
read(inotfd, event, bufsiz);

/* process event struct here */

Wenn Sie nur eine Befehlszeilenanwendung benötigen, gibt es eine namens inotifywait das Dateien mit inotify überwacht

von Klemme 1

# touch cheese
# while inotifywait -e modify cheese; do 
>   echo someone touched my cheese
> done

von Klemme 2

echo lol >> cheese

Hier ist, was auf Terminal 1 zu sehen ist

Setting up watches.
Watches established.
cheese MODIFY 
someone touched my cheese
Setting up watches.
Watches established.

Aktualisieren :mit Vorsicht verwenden und die Kommentare beachten.


Da die anfängliche Frage Qt als Tag zu erwähnen scheint, wie in mehreren Kommentaren hier erwähnt, haben Suchmaschinen Sie möglicherweise hierher geführt.

Wenn jemand wissen möchte, wie man das mit Qt macht, siehe http://doc.qt.io/qt-5/qfilesystemwatcher.html für die Qt-Version. Unter Linux verwendet es eine Teilmenge von Inotify, falls verfügbar, siehe Erklärung auf der Qt-Seite für Details.

Im Grunde sieht der benötigte Code so aus:

in mainwindow.h hinzufügen:

QFileSystemWatcher * watcher;
private slots:
    void directoryChanged(const QString & path);
    void fileChanged(const QString & path);

und für mainwindow.cpp:

#include <QFileInfo>
#include <QFileSystemWatcher>

watcher = new QFileSystemWatcher(this);
connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &)));
connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &)));
watcher->addPath("/tmp/"); // watch directory
watcher->addPath("/tmp/a.file");  // watch file

Fügen Sie auch die Slots in mainwindow.cpp hinzu, die aufgerufen werden, wenn ein Datei-/Verzeichniswechsel bemerkt wird:

void MainWindow::directoryChanged(const QString & path) {
     qDebug() << path;
}
void MainWindow::fileChanged(const QString & path) {
     qDebug() << path;
}

  • Dokumentation ( von Monitor file system activity withinotify )

Die inotify C-API

inotify bietet drei Systemaufrufe zum Erstellen von Dateisystemmonitoren aller Art:

  • inotify_init() erstellt eine Instanz von inotify Subsystem im Kernel und gibt bei Erfolg einen Dateideskriptor und -1 zurück auf Versagen. Wie andere Systemaufrufe, wenn inotify_init() fehlschlägt, überprüfen Sie errno zur Diagnostik.
  • inotify_add_watch() fügt, wie der Name schon sagt, eine Uhr hinzu . Jede Überwachung muss einen Pfadnamen und eine Liste relevanter Ereignisse bereitstellen, wobei jedes Ereignis durch eine Konstante angegeben wird, z. B. IN_MODIFY . Um mehr als ein Ereignis zu überwachen, verwenden Sie einfach das logische oder – den senkrechten Strich (|) in C – zwischen den einzelnen Ereignissen. Wenn inotify_add_watch() erfolgreich ist, gibt der Aufruf eine eindeutige Kennung für die registrierte Uhr zurück; andernfalls wird -1 zurückgegeben . Verwenden Sie die Kennung, um die zugehörige Uhr zu ändern oder zu entfernen.
  • inotify_rm_watch() entfernt eine Uhr.

Die read() und close() Systemaufrufe werden ebenfalls benötigt. Gegeben ist der von inotify_init() gelieferte Deskriptor , rufen Sie read() an um auf Benachrichtigungen zu warten. Unter der Annahme eines typischen Dateideskriptors blockiert die Anwendung bis zum Empfang von Ereignissen, die als Daten im Strom ausgedrückt werden. Das gemeinsame close() auf dem Dateideskriptor ergibt sich aus inotify_init() löscht und gibt alle aktiven Überwachungen sowie den gesamten Speicher frei, der der inotify-Instanz zugeordnet ist. (Auch hier gilt der typische Vorbehalt bezüglich der Anzahl der Referenzen. Alle Dateideskriptoren, die einer Instanz zugeordnet sind, müssen geschlossen werden, bevor der von den Überwachungen und von Inotify verbrauchte Speicher freigegeben wird.)

  • Ein Beispiel ( von Kernel Korner - Intro to inotify )
#include "inotify.h"  
#include "inotify-syscalls.h"  
int wd;   
wd = inotify_add_watch (fd,   
            "/home/rlove/Desktop", IN_MODIFY | IN_CREATE | IN_DELETE);
if (wd < 0)
      perror ("inotify_add_watch");

Dieses Beispiel fügt dem Verzeichnis /home/rlove/Desktop eine Überwachung für Änderungen, Dateierstellung oder Dateilöschung hinzu.


Linux
  1. Was ist der Zweck der .bashrc-Datei in Linux

  2. Was ist die Verwendung von $ # in Bash

  3. Was ist der schnellste Weg, um Text über die Befehlszeile zu einer Datei hinzuzufügen?

  4. Richtige Methode zur Verwendung von OnFailure in systemd

  5. Wozu dient die Option -o im Befehl useradd?

So verwenden Sie den Touch-Befehl unter Linux

So verwenden Sie den Linux-Kopfbefehl

So verwenden Sie den Linux-diff-Befehl

Wie verwende ich den Gzip-Befehl unter Linux?

Wozu dient LLVM in Android NDK Toolchains?

Was ist der schnellste Weg, um ein Skript auszuführen?