2013-03-05 16 views
5

Ich habe das Beispiel here optimiert, um es wiederholt eine Datei für "Änderungen" zu sehen. Mein Code ist here. In meinen Tests wird die Inotify-Benachrichtigung nur ausgelöst, wenn die Datei zum ersten Mal "modifiziert" wird (d. H. touch 'ed). Bei späteren Änderungen an der Datei werden keine Benachrichtigungen ausgelöst. stat zeigt, dass sich die Zeit zum Ändern geändert hat. Das Ändern des Codes, um die Überwachung zu entfernen und jedes Mal neu hinzuzufügen, wenn eine Benachrichtigung ausgelöst wird (z. B. inotify_add_watch und inotify_rm_watch in der while(1)-Schleife in meinem sample), hat nicht zur Behebung dieses Problems beigetragen.Inotify nicht feuern Benachrichtigungen bei Dateiänderung

Ich fragte mich, ob jemand hier mit dem helfen könnte, was ich falsch mache. Auch wenn ich eine Uhr für IN_ALL_EVENTS hinzugefügt habe, interessiere ich mich wirklich nur für IN_MODIFY Ereignisse. Nicht sicher, ob das einen Unterschied macht.

Auch funktioniert dieser Anwendungsfall nicht? Sollte ich meinen Ansatz ändern, stattdessen das Verzeichnis zu sehen? Bitte um Rat.

TIA.

Edit 1: Wie von themel festgestellt, benötigt die Handhabung von i einige Fixierungen. Jedoch feuert auch die feste Version keine Benachrichtigungen für nachfolgende Dateisystem-Ereignisse. Das Hinzufügen einer Überwachung für das Verzeichnis im Gegensatz zur Datei weist ebenfalls ein ähnliches nichtdeterministisches Verhalten auf.

Edit 2: Ich möchte diese asio + inotify example basierend auf this answer zu arbeiten. Leider hat dieses Beispiel für mich überhaupt nicht funktioniert. Jede Hilfe würde sehr geschätzt werden. TIA.

Antwort

2

Nach der Behebung des Themas funktioniert Ihr Code in meinen Tests gut, wenn ich ein Verzeichnis anschaue. Wenn Sie eine Datei ansehen, ist event->len Null und Ihr Code ignoriert die Benachrichtigungen.

Mit dem Test für event->len entfernt und alle event->name ersetzt durch file_path in den printf-Anweisungen, funktioniert es auch beim Ansehen einer Datei.

PS: Gerade bemerkt, Sie erwähnen touch.

touch sendet die folgenden Ereignisse:

IN_OPEN 
IN_ATTRIB 
IN_CLOSE_WRITE 

kein IN_MODIFY

Auch nicht Modifikation testen, indem Sie es mit vim Bearbeitung wie ich gerade tat - es die Datei löscht, während die Arbeitskopie schlurfend und der Swap, der die Uhr entfernt. pico funktioniert.

+0

Obwohl ich mich wundere, warum 'touch' keine 'IN_MODIFY'-Benachrichtigung verursacht. "stat" scheint darauf hinzuweisen, dass "touch" die "Modify" -Zeit der Datei geändert hat. –

2

Ihre Behandlung von i ist kaputt, Sie setzen es nie auf 0 in der Schleife zurück. Dies führt dazu, dass alle späteren Inotify-Ereignisse nur berücksichtigt werden, wenn sie länger sind als das längste Ereignis vor ihnen, was wahrscheinlich nicht das ist, was Sie wollen.

Fixed version.

+0

Sie haben Recht. Die Handhabung von 'i' war sicherlich kaputt - danke, dass ich das verstanden habe. Allerdings scheint auch die feste Version spätere Benachrichtigungen zu vermissen (nach der ersten Benachrichtigung feuert).Irgendwelche Gedanken, um das zu beheben? –

+0

Hm, ich erhalte inotify Ereignisse mit diesem Code (aber keine Ihrer Bedingungen wird ausgelöst, weil a) beim Anzeigen einer einzelnen Datei Ereignis-> Name immer leer ist und b) berühren Sie IN_ATTRIB Ereignisse, nicht IN_MODIFY). – themel

0

Beim Überwachen einer einzelnen Datei wird event-> len 0, da der Dateiname nicht zurückgegeben wird. Ich habe bemerkt, dass viele Beispielprogramme dieses Problem haben.