GNU/Linux >> Znalost Linux >  >> Linux

Jaký je správný způsob použití inotify?

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ří instanci inotify 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í, pokud inotify_init() selže, zkontrolujte errno 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říklad IN_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. Pokud inotify_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ů.


Linux
  1. Co znamená „rc“ v „.bashrc“ atd.?

  2. Jaký je nejrychlejší způsob přidání textu do souboru z příkazového řádku?

  3. Existuje správný způsob, jak vymazat protokoly?

  1. Jak používat příkaz Tar v Linuxu

  2. Jaký je účel souboru .bashrc v Linuxu

  3. Jak mohu použít řádky souboru jako argumenty příkazu?

  1. Jaký je správný způsob vložení karty do sed?

  2. Jaké je použití $# v Bash

  3. Jaký je nejlepší způsob, jak se naučit SELinux?