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 a access
, y las llamadas access
en un ciclo muy cerrado serán lentas, y es el tipo de problema que inotify
fue diseñado para resolver.
access
conF_OK
para ver si todavía existe.