Níže je úryvek toho, jak můžete použít inotify ke sledování „aaa“. Všimněte si, že jsem to netestoval, dokonce jsem to ani nezkompiloval! K tomu budete muset přidat kontrolu chyb.
Místo blokování čtení můžete také použít poll/select na inotfd.
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 */
Pokud vše, co potřebujete, je aplikace příkazového řádku, existuje jedna s názvem inotifywait
který sleduje soubory pomocí inotify
z terminálu 1
# touch cheese
# while inotifywait -e modify cheese; do
> echo someone touched my cheese
> done
z terminálu 2
echo lol >> cheese
zde je to, co je vidět na terminálu 1
Setting up watches.
Watches established.
cheese MODIFY
someone touched my cheese
Setting up watches.
Watches established.
Aktualizovat :používejte opatrně a podívejte se na komentáře.
Vzhledem k tomu, že se zdá, že úvodní otázka zmiňuje Qt jako značku, jak je uvedeno v několika komentářích zde, vyhledávače vás možná navedly sem.
Pokud někdo chce vědět, jak to udělat s Qt, podívejte se na http://doc.qt.io/qt-5/qfilesystemwatcher.html pro verzi Qt. V Linuxu používá podmnožinu Inotify, pokud je k dispozici, podrobnosti viz vysvětlení na stránce Qt.
V podstatě potřebný kód vypadá takto:
v mainwindow.h přidejte :
QFileSystemWatcher * watcher;
private slots:
void directoryChanged(const QString & path);
void fileChanged(const QString & path);
a pro 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
také přidejte sloty v mainwindow.cpp, které se volají, pokud je zaznamenána změna souboru/adresáře:
void MainWindow::directoryChanged(const QString & path) {
qDebug() << path;
}
void MainWindow::fileChanged(const QString & path) {
qDebug() << path;
}
- Dokumentace (z Monitorovat aktivitu souborového systému v rámciotify)
inotify
C API
inotify
poskytuje tři systémová volání pro sestavení monitorů souborového systému všeho druhu:
inotify_init()
vytvoří instanciinotify
subsystému v jádře a při úspěchu vrátí deskriptor souboru a-1
na selhání. Stejně jako ostatní systémová volání, pokudinotify_init()
selže, zkontrolujteerrno
pro diagnostiku.inotify_add_watch()
, jak už název napovídá, přidává hodinky . Každé sledování musí poskytovat název cesty a seznam příslušných událostí, přičemž každá událost je určena konstantou, napříkladIN_MODIFY
. Chcete-li monitorovat více než jednu událost, jednoduše použijte mezi každou událostí logický operátor nebo — svislý operátor (|) v C. Pokudinotify_add_watch()
uspěje, volání vrátí jedinečný identifikátor pro registrované hodinky; jinak vrátí-1
. Pomocí identifikátoru můžete změnit nebo odebrat přidružené hodinky.inotify_rm_watch()
odstraní hodinky.
read()
a close()
jsou také potřebná systémová volání. Daný deskriptor poskytnutý inotify_init()
, zavolejte na read()
čekat na upozornění. Za předpokladu typického deskriptoru souboru aplikace blokuje až do přijetí událostí, které jsou vyjádřeny jako data ve streamu. Společné close() na deskriptoru souboru vycházelo z inotify_init()
odstraní a uvolní všechny aktivní hodinky a také veškerou paměť spojenou s instancí inotify. (I zde platí typické upozornění na počet referencí. Všechny deskriptory souborů spojené s instancí musí být uzavřeny, než se uvolní paměť spotřebovaná hodinkami a inotify.)
- Příklad (od 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");
Tento příklad přidá hlídač do adresáře /home/rlove/Desktop pro jakékoli úpravy, vytváření souborů nebo mazání souborů.