2009-07-06 13 views
7

¿Cómo puedo saber si un archivo está abierto en C? Creo que la pregunta más técnica sería cómo puedo recuperar el número de referencias a un archivo existente y determinar con esa información si es seguro abrirlo.¿Cómo puedo saber si un archivo está abierto en otra parte de C en Linux?

La idea que estoy implementando es una cola de archivos. Usted descarga algunos archivos, mi código procesa los archivos. No quiero comenzar a procesar hasta que el productor cierre el descriptor de archivo.

Todo se está haciendo en Linux.

Gracias, Chenz

Respuesta

5

excavación de esa información es un montón de trabajo (que tendría que buscar thorugh/proc/*/fd Usted sería mejor con cualquiera de:

  • Guardar a temperatura cambie el nombre. Escriba sus archivos en un nombre de archivo o directorio temporal, cuando termine de escribir, cámbiele el nombre al directorio donde lo lee su aplicación. El cambio de nombre es atómico, por lo que cuando el archivo está presente, sabe que es seguro.
  • una variante de lo anterior, cuando haya terminado de escribir el archivo foo crea un archivo vacío llamado foo.finished. Busca la presencia de * .finished cuando procesa archivos.
  • Bloquea los archivos mientras escribes, de esta forma, leer el archivo solo se bloqueará hasta que el escritor lo desbloquee. Consulte las funciones de flock/lockf, aunque son bloqueos de aviso, por lo que el lector y el escritor deben bloquear y respetar los bloqueos.
+0

He llegado a la conclusión de que la segunda sugerencia es la mejor para mi situación. ¡Gracias! –

3

No creo que hay alguna manera de hacer esto en C puro (no sería multiplataforma).

Si conoce los archivos que está utilizando con anterioridad, puede usar inotify para recibir una notificación cuando se abran.

+1

Sí, también puede usar inotify para detectar que un archivo se ha cerrado. – zvrba

0

C tiene instalaciones para manejar archivos, pero no mucho para obtener información sobre ellos. En C portátil, lo único que puede hacer es intentar abrir el archivo de la manera deseada y ver si funciona.

0

generalmente no se puede hacer eso por varias razones (por ejemplo, no se puede decir si el archivo se abre con otro usuario).

Si usted puede controlar los procesos que abren el archivo y se le trate de evitar colisiones mediante el bloqueo del archivo (hay muchas bibliotecas en Linux con el fin de hacer eso)

0

Utilice el comando lsof. (Lista de archivos abiertos).

0

Si tiene el control tanto del productor como del consumidor, puede usar lockf() de flock() para bloquear el archivo.

0

hay un comando lsof en la mayoría de las distribuciones, que muestra todos los archivos actualmente abiertos, puede por supuesto grep su salida si sus archivos están en el mismo directorio o tienen algún patrón de nombre reconocible.

Cuestiones relacionadas