2009-07-03 11 views
5

Actualmente estoy viendo un archivo XML desde la salida log4j. Tengo un visor personalizado que muestra el resultado del registro en la GUI. Necesito ver este archivo en cuanto a cuándo se actualiza para que la GUI pueda volver a analizarse y actualizarse. En C# hay un concepto de FileWatcher así que en Windows no-probs, pero qué opciones tengo usando C en Linux.Linux: ¿Cómo averiguo si un archivo ha sido actualizado por otro proceso?

¿Hay una forma estándar de hacer esto tanto en sabores de UNIX como en Linux (POSIX quizás)?

Gracias

Respuesta

6

John mencionó las dos rutas principales que puede seguir para ver archivos en sistemas Unix/Linux: notificación y sondeo.

La notificación se produce cuando el propio sistema (generalmente el kernel) desencadena un mensaje a las aplicaciones registradas cada vez que se accede o se escribe en el archivo. Este enfoque requiere un sistema compatible y es posible que no esté disponible en máquinas más antiguas.

La implementación principal de la notificación en Linux es inotify, que está integrada en los núcleos 2.6.13 y posteriores y puede ser parchada en 2.6.12 y versiones anteriores. Hay un nice IBM guide en el uso de inotify, así como un set of tools and C library básico para acceder a inotify.

El sondeo es cuando su programa comprueba repetidamente un archivo a intervalos para ver si se modificó algo sobre ese archivo: su tamaño, la última modificación, el propietario, etc.

No hay una implementación estándar de esto, ya que está escrito a nivel de programa en lugar de sistema, aunque la llamada al sistema poll existe y parece hacer algo útil para este propósito (la página man dice que es similar a select , y espera que un evento esté disponible en un descriptor de archivo). También puede tomar el enfoque más básico con stat y hacer sus propias comprobaciones.

+0

gracias por la explicación –

+0

Dudo que la encuesta() ayude. Parece que no entendiste lo que hace poll(). A menos que quieras usarlo * con * inotify. – Thomas

+0

Para aclarar: poll() solo puede decirle cosas como "si leo() desde este archivo ahora, ¿bloqueará eso?" o "Espere al máximo 3 segundos o hasta que pueda leer (sin el bloqueo de lectura()) de al menos uno de estos descriptores de archivo". – Thomas

6

¿Está buscando algo así como inotify?

Como alternativa, puede sondear el archivo usando stat.

+0

Satisface mis necesidades perfectamente, pero creo que tendré que reinventar la rueda y codificarla usando las API C estándar. Entonces, ¿hay alguna posibilidad de que pueda hacerlo usando simples API fstat y stat? –

+0

Es posible que desee aclarar que ... Si inotify suena como lo que necesita, y usted está en Linux, ¿por qué no puede simplemente usarlo? – unwind

0

Si desea algo más portátil que inotify, que es un Linux-ism, busque en el File Alteration Monitor, que es una tecnología más antigua y portátil, pero puede tener un rendimiento menor. Por otro lado, hace algo útil con los sistemas de archivos montados en NFS, que dependiendo de su aplicación podrían ser importantes.

+0

gracias por la sugerencia, especialmente porque es independiente del kernel y probablemente funciona con sistemas montados con NFS. –

Cuestiones relacionadas