inotify stoppt Überwachung Datei, wenn die Datei gelöscht und neu angelegt

StackOverflow https://stackoverflow.com/questions/4665833

  •  10-10-2019
  •  | 
  •  

Frage

Ich begegne ein Problem bei der Verwendung von inotify. Ich benutze inotify Änderungen an Dateien zu überwachen. Hier ist mein Code:

int fd = inotify_init();
int wd = inotify_add_watch(fd, "/root/temp", IN_ALL_EVENTS);
int bufSize = 1000;
char *buf = new char[bufSize];
memset(buf, 0, sizeof(buf));
int nBytes = read(fd, buf, bufSize - 1);
cout << nBytes << " bytes read" << endl;
inotify_event *eventPtr = (inotify_event *)buf;
int offset = 0;
while (offset < nBytes)
{
    cout << eventPtr->mask << endl;
    offset += sizeof(inotify_event) + eventPtr->len;
    eventPtr = (inotify_event *)(buf + offset);
}
delete []buf;

Wenn ich löschen „/ root / temp“, und erstellen Sie eine solche Datei, werden alle Änderungen an dieser Datei überwacht wird nicht durch inotify, jemand, wie ist das? Danke.

cheng

War es hilfreich?

Lösung

Das ist, weil inotify überwacht die zugrunde liegenden inode , nicht der Dateiname . Wenn Sie diese Datei löschen, die Inode Sie gerade beobachten wird ungültig, daher müssen Sie inotify_rm_watch aufrufen. Wenn Sie eine neue Datei mit dem gleichen Namen überwachen möchten, aber eine andere Inode, müssen Sie erkennen, wenn es durch die Überwachung der übergeordneten Ordner erstellt wird.

Andere Tipps

Die beiden anderen Antworten sind richtig. Ein weiterer nützlicher Punkt ist, dass inotify Sie sagt, wenn die Uhr für ungültig erklärt wird.

mask & IN_IGNORED

wird nicht Null sein. IN_IGNORED wird gesetzt, wenn:

"Watch wurde explizit entfernt (inotify_rm_watch (2)) oder automatisch (Datei gelöscht wurde, oder das Dateisystem war unmontiert)."

So, wie bereits erwähnt, wenn diese festgelegt ist, können Sie die Datei rewatch (und / oder das Verzeichnis, wenn die Datei noch nicht neu erstellt worden ist).

Wenn Sie verwenden eine API, Lesen Sie die Dokumentation .

inotify Arbeiten die einzigartige Datei identifer Inode mit, kein Dateiname. Der gesamte Linux-Kernel arbeitet mit I-Nodes in der Tat. Die Dateinamen sind nur ein Mittel Inodes suchen.

bekommen, was Sie wollen, müssen Sie das Verzeichnis / root überwachen. Es wird eine Schöpfung Ereignis berichten, wenn eine Datei hinzugefügt wird. Wenn diese Datei den Namen „temp“, dann können Sie eine Uhr auf dieser Datei hinzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top