2011-01-12 8 views
1

Ich stoße auf ein Problem, wenn ich inotify verwende. Ich verwende inotify, um Änderungen an Dateien zu überwachen. Hier ist mein Code:Inotify stoppt die Dateiüberwachung, wenn die Datei gelöscht und neu erstellt wird

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 eine solche Datei, werden alle Änderungen an dieser Datei nicht durch inotify überwacht wird, jemand, wie das ist? Vielen Dank.

cheng

Antwort

6

Das ist, weil inotifydas zugrundeliegende inode überwacht, nicht der Dateiname. Wenn Sie diese Datei löschen, wird der aktuell überwachte Inode ungültig. Daher müssen Sie inotify_rm_watch aufrufen. Wenn Sie eine neue Datei mit demselben Namen, aber einem anderen Inode überwachen möchten, müssen Sie feststellen, wann sie erstellt wurde, indem Sie ihren übergeordneten Ordner überwachen.

3

Jedes Mal, wenn Sie eine API verwenden, LESEN DER DOKUMENTATION.

Inotify funktioniert mit der eindeutigen Dateikennung inode, kein Dateiname. Der gesamte Linux-Kernel arbeitet tatsächlich mit Inodes. Dateinamen sind nur ein Mittel zum Nachschlagen von Inodes.

Um zu bekommen, was Sie wollen, müssen Sie das/root-Verzeichnis überwachen. Es wird ein Erstellungsereignis gemeldet, wenn eine Datei hinzugefügt wird. Wenn diese Datei den Namen "temp" hat, können Sie eine Überwachung für diese Datei hinzufügen.

4

Die anderen zwei Antworten sind korrekt. Ein weiterer nützlicher Punkt ist, dass inotify Ihnen sagt, wenn die Uhr ungültig ist.

mask & IN_IGNORED 

wird nicht Null sein. IN_IGNORED wird gesetzt, wenn:

"Watch wurde explizit entfernt (inotify_rm_watch (2)) oder automatisch (Datei wurde gelöscht, oder Dateisystem wurde ausgehängt)."

Wenn dies festgelegt ist, können Sie die Datei (und/oder das Verzeichnis, falls die Datei noch nicht neu erstellt wurde) erneut anzeigen.

Verwandte Themen