Quiero recibir una notificación cuando se cree un nombre de archivo específico. Estoy mirando inotify
. El IN_CREATE
indicador está disponible para monitorear un directorio para cualquier cambio dentro de él, pero preferiría no monitorear todo el directorio ya que puede haber mucha actividad en ese directorio además del archivo en el que estoy interesado. ¿Se puede hacer esto? ?
9
access
conF_OK
para ver si todavía existe.Respuestas:
No puede hacer que el núcleo solo le informe de un cambio en una ruta determinada. Las razones son un poco sutiles:
En Linux, un objeto de archivo existe independientemente de cualquier nombre (s) que pueda tener. Los nombres de los archivos son en realidad atributos de su directorio contenedor, y un solo archivo puede ser llamado por varios nombres (ver, hardlinking).
El núcleo tiene que tener algo para adjuntar objetos inotify; no puede adjuntar un objeto a un nombre de ruta ya que un nombre de ruta no es un objeto real del sistema de archivos; debe adjuntarlo al directorio principal o al archivo que describe la ruta. Pero no puede adjuntarlo al archivo, ya que está observando si se crea un archivo con un nombre determinado, no cambios en un archivo dado.
Teóricamente, el núcleo podría implementar una API que le permita seleccionar eventos para un nombre de ruta dado al agregar un reloj a un directorio, de la misma manera que le permite seleccionar tipos de eventos. Esto hincharía la API, y el núcleo al final estaría procesando los mismos datos y haciendo la misma comparación de cadenas que estaría haciendo en el espacio de usuario.
¿Hay un impacto notable en el rendimiento al colocar un reloj en un directorio muy activo? No estoy seguro de qué tan activo quieres decir; ¿Decenas de archivos por segundo, cientos, millones?
En cualquier caso, evitaría
access
: siempre va a ser una carrera. Se podría crear y eliminar un archivo entre llamadas aaccess
, y las llamadasaccess
en un ciclo muy cerrado serán lentas, y es el tipo de problema queinotify
fue diseñado para resolver.fuente
inotify
y si el rendimiento fue un problema real.