2009-07-03 14 views
5

Attualmente sto guardando un file XML dall'uscita log4j. Ho un visualizzatore personalizzato che mostra l'output del registro nella GUI. Ho bisogno di guardare questo file quando viene aggiornato in modo che la GUI possa ri-analizzare e aggiornarsi. In C# c'è un concetto di FileWatcher, quindi su Windows no-probs, ma quali opzioni ho usando C su Linux.Linux: come faccio a sapere se un file è stato aggiornato da un altro processo?

Esiste un metodo standard per eseguire questa operazione su entrambi i gusti unix e linux (forse POSIX)?

Grazie

risposta

6

John ha menzionato i due percorsi principali che è possibile eseguire per la visione di file con sistemi Unix/Linux: notifica e polling.

La notifica è quando il sistema stesso (di solito il kernel) attiva un messaggio per le applicazioni registrate ogni volta che si accede o si scrive a un file. Questo approccio richiede un sistema conforme e potrebbe non essere disponibile su macchine precedenti.

L'implementazione principale della notifica sotto Linux è inotify, che è incorporata nei kernel 2.6.13 e successivi e può essere modificata in 2.6.12 e versioni precedenti. C'è un nice IBM guide sull'utilizzo di inotify e uno set of tools and C library di base per accedere a inotify.

Polling è quando il programma controlla ripetutamente un file a intervalli per vedere se qualcosa di quel file - le sue dimensioni, l'ultima modifica, il proprietario, ecc. - è stato modificato.

Non c'è implementazione standard di questo, come è scritto su un livello di programma piuttosto che base a livello di sistema, anche se la chiamata di sistema poll esiste e sembra di fare qualcosa di utile per questo scopo (la pagina man dice che è simile a select e attende che un evento diventi disponibile su un descrittore di file). Puoi anche prendere l'approccio più semplice con stat e fare il tuo controllo da solo.

+0

grazie per la spiegazione –

+0

dubito che poll() sarà di aiuto. Sembra che tu abbia frainteso ciò che sond() fa. A meno che non intendi usarlo * con * inotify. – Thomas

+0

Per chiarire: sondaggio() può solo dirti cose come "se leggo() da questo file ora, sarà questo blocco?" oppure "Attendi max 3 secondi o finché non riesco a leggere (senza il blocco di read() da almeno uno di questi descrittori di file". – Thomas

6

Siete alla ricerca di qualcosa di simile inotify?

In alternativa è possibile eseguire il polling del file utilizzando stat.

+0

Che soddisfi perfettamente le mie esigenze, ma penso che dovrò reinventare la ruota e codificarla utilizzando le API C standard. Quindi c'è qualche possibilità che io possa farlo usando semplici API fstat e stat? –

+0

Si potrebbe voler chiarire che ... Se inotify suona come quello che vi serve, e sei su Linux, perché non si può semplicemente usarlo? – unwind

0

Se si desidera qualcosa di più portatile di inotify, che è un Linux-ism, esaminare lo File Alteration Monitor, che è una tecnologia più vecchia e più portatile, ma può essere meno performante. D'altra parte, fa qualcosa di utile con i filesystem montati su NFS, che a seconda dell'applicazione potrebbero essere importanti.

+0

grazie per il suggerimento, in particolare perché è indipendente dal kernel e probabilmente funziona con i sistemi montati su NFS. –

Problemi correlati