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 voninotify
Subsystem im Kernel und gibt bei Erfolg einen Dateideskriptor und-1
zurück auf Versagen. Wie andere Systemaufrufe, wenninotify_init()
fehlschlägt, überprüfen Sieerrno
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. Wenninotify_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.