2013-03-05 26 views
5

Poprawiłem przykład here, aby go wielokrotnie oglądać plik "modyfikacji". Mój kod to here. W moich testach powiadomienie inotify uruchamia tylko pierwszy plik "zmodyfikowany" (tj. touch "ed). Wszelkie kolejne modyfikacje pliku nie powodują żadnych powiadomień. stat pokazuje, że zmienił się czas modyfikacji. Ponadto modyfikowanie kodu w celu usunięcia zegarka i ponowne dodanie za każdym razem, gdy powiadomienie jest uruchamiane (tj. Przeniesienie inotify_add_watch i inotify_rm_watch do wnętrza pętli while(1) w moim sample) nie pomogło rozwiązać tego problemu.inotify nie wypalanie powiadomienia o modyfikacji pliku

Zastanawiam się, czy ktoś tutaj może pomóc w tym, co robię źle. Ponadto, mimo że dodałem zegarek dla IN_ALL_EVENTS, naprawdę zależy mi tylko na wydarzeniach IN_MODIFY. Nie jestem pewien, czy to ma jakieś znaczenie.

Czy ten przypadek nie działa? Czy powinienem zmienić moje podejście do oglądania katalogu? Proszę o poradę.

TIA.

Edycja 1: Jak odnotowano w dokumencie themel, obsługa i wymagała naprawy. Jednak nawet stała wersja nie uruchamia powiadomień dla kolejnych "systemów" plików. Dodanie zegarka do katalogu w przeciwieństwie do pliku wykazuje podobne niedeterministyczne zachowanie.

Edycja 2: Chciałbym uzyskać ten asio + inotify example w oparciu o this answer do pracy. Niestety ten przykład w ogóle mi nie działa. Każda pomoc byłaby bardzo cenna. TIA.

Odpowiedz

2

Po naprawie pliku, twój kod działa poprawnie podczas przeglądania katalogu, w moich testach. Podczas oglądania pliku, event->len ma wartość zero, a Twój kod ignoruje powiadomienia.

Po usunięciu testu dla event->len i wszystkich event->name zastąpionych przez file_path w instrukcjach printf, działa również dobrze podczas oglądania pliku.

PS: Właśnie zauważyłem, że wspomniałeś o touch.

touch wysyła następujące zdarzenia:

IN_OPEN 
IN_ATTRIB 
IN_CLOSE_WRITE 

no IN_MODIFY

Również nie przetestować modyfikacji edytując go vim jak ja po prostu nie - usuwa plik podczas tasowania kopię roboczą i zamiana, która usuwa zegarek. pico działa.

+0

Chociaż zastanawiam się, dlaczego 'touch' nie powoduje powiadomienia' IN_MODIFY'. 'stat' sugeruje, że' touch' zmodyfikował czas modyfikacji pliku. –

2

Twoje postępowanie z i jest zepsute, nigdy nie resetujesz go do 0 w pętli. Powoduje to, że wszelkie późniejsze zdarzenia inotify będą brane pod uwagę tylko wtedy, gdy są dłuższe niż najdłuższe zdarzenie przed nimi, co prawdopodobnie nie jest tym, czego potrzebujesz.

Fixed version.

+0

Masz rację. Obsługa "i" z pewnością została przerwana - dzięki za złapanie tego. Jednak nawet poprawiona wersja wydaje się nie trafiać w późniejsze powiadomienia (po pierwszym uruchomieniu powiadomienia).Wszelkie przemyślenia na ten temat? –

+0

Hm, ciągle otrzymuję inotify zdarzenia z tym kodem (ale żaden z twoich warunków nie strzela, ponieważ a) podczas oglądania pojedynczego pliku, zdarzenie-> nazwa będzie zawsze pusta i b) dotyk da ci zdarzenia IN_ATTRIB, a nie IN_MODIFY). – themel

0

podczas monitorowania pojedynczego zdarzenia pliku-> len będzie 0, ponieważ nazwa pliku nie jest zwracana. Zauważyłem, że wiele programów przykładowych ma ten problem.