2013-03-05 14 views
5

Ho modificato l'esempio here per far sì che venga ripetutamente visualizzato un file per "modifiche". Il mio codice è here. Nei miei test la notifica inotify viene attivata solo la prima volta che il file viene "modificato" (cioè touch "ed). Qualsiasi modifica successiva al file non causa l'attivazione di alcuna notifica. stat mostra che l'ora di 'Modifica' è cambiata. Inoltre, modificare il codice per rimuovere l'orologio e riaggiungere ogni volta che viene generato un avviso (ovvero spostare inotify_add_watch e inotify_rm_watch all'interno del ciclo while(1) nel mio sample) non ha aiutato a risolvere questo problema.non inotify notifiche di attivazione su file

Mi stavo chiedendo se qualcuno qui potrebbe aiutare con quello che potrei fare male. Inoltre, anche se ho aggiunto un orologio per IN_ALL_EVENTS, mi interessano solo gli eventi IN_MODIFY. Non sono sicuro che ciò faccia differenza.

Inoltre, questo caso d'uso non funziona? Devo cambiare il mio approccio per guardare invece la directory? Per favore consiglio

TIA.

Modifica 1: come indicato da themel, la gestione di i ha richiesto un po 'di correzione. Tuttavia, anche la versione fissa non attiva le notifiche per i successivi "eventi" del filesystem. Inoltre, l'aggiunta di un orologio sulla directory rispetto al file mostra un comportamento non deterministico simile.

Modifica 2: Mi piacerebbe ottenere questo asio + inotify example basato su this answer per funzionare. Sfortunatamente quell'esempio non ha funzionato affatto per me. Qualsiasi aiuto sarebbe molto apprezzato. TIA.

risposta

2

Dopo la correzione di themel, il codice funziona correttamente quando si guarda una directory, nei miei test. Quando si guarda un file, event->len è zero e il codice ignora le notifiche.

Con il test per event->len rimosso e tutto event->name sostituito da file_path nelle istruzioni printf, funziona bene anche quando si guarda un file.

PS: Ho appena notato che menzioni touch.

touch invia i seguenti eventi:

IN_OPEN 
IN_ATTRIB 
IN_CLOSE_WRITE 

senza IN_MODIFY

Inoltre, non provare modifica modificandolo con vim come ho appena fatto - si elimina il file mentre si mescola la copia di lavoro e lo scambio, che rimuove l'orologio. pico funziona.

+0

Anche se mi chiedo perché 'touch' non causa una notifica' IN_MODIFY'. 'stat' sembra suggerire che' touch' abbia modificato il tempo di 'Modifica' del file. –

2

La gestione di i è errata, non è mai stata reimpostata su 0 nel ciclo. Ciò causa la considerazione di eventuali eventi successivi di inotify solo quando sono più lunghi dell'evento più lungo prima di loro, il che non è probabile ciò che si desidera.

Fixed version.

+0

Hai ragione. La gestione di "i" è stata certamente rotta - grazie per averlo capito. Tuttavia anche la versione fissa sembra perdere le notifiche successive (dopo la prima notifica di accensione).Qualche idea su come risolvere questo? –

+0

Hm, continuo a ricevere eventi inotify con quel codice (ma nessuna delle condizioni si attiva perché a) quando si guarda un singolo file, event-> il nome sarà sempre vuoto e b) touch darà gli eventi IN_ATTRIB, non IN_MODIFY). – themel

0

durante il monitoraggio di un singolo file event-> len sarà 0 perché il nome del file non viene restituito. Ho notato che molti dei programmi di esempio hanno questo problema.

Problemi correlati