¿Averigua cuántas veces se ha abierto un archivo?

¿Averigua cuántas veces se ha abierto un archivo?

Bien, aquí hay un acertijo: ¿cómo puedo saber cuántas veces un archivo en particular ha sido abierto (en cualquier modo) por cualquiera o todos los procesos que se ejecutan actualmente en una máquina Linux? Es decir, ¿cuántos descriptores de archivos, globalmente (o dentro de un espacio de nombres/contenedor, no importa) están en uso que hacen referencia a un archivo/inodo en particular?

Una forma de averiguarlo probablemente sería usar lsof y contar cuántas veces aparece el nombre del archivo en cuestión en su salida. Pero eso parece poco elegante y, en cualquier caso, necesitaría algo como esto programáticamente, en C.

Editar: o tal vez una pregunta similar pero diferente, que también sería útil: ¿hay un archivo en particular (un archivo aleatorio en el sistema de archivos, por lo que no se deben adjuntar controladores y esperar a que suceda algo) abierto, mediante cualquier proceso (posiblemente excluyendo este? uno)?

Respuesta1

Para los archivos actualmente abiertos, si está en Linux, tendría que revisar stat()todos los /proc/*/fd/*archivos y comparar los números de inodo; y leer todos los /proc/*/maps(y también comparar los números de inodo).

Verifique las banderas en /proc/*/fdinfo/*(necesita una versión relativamente reciente de Linux) y la segunda columna /proc/*/mapspara ver si el archivo está abierto en modo lectura o escritura (o ambos, o con un anexo...).

Respuesta2

Creo que desea adjuntar un controlador de eventos del sistema de archivos al archivo, inotifyese es el camino a seguir. Hay una herramienta de línea de comandos y una API de C. No soy un experto en su uso, solo he jugado con la herramienta de línea de comandos durante unos minutos, por lo que no intentaré proporcionar ningún ejemplo de código, pero puedes encontrar mucha información en las búsquedas de Google.

https://www.ibm.com/developerworks/library/l-inotify/

https://linux.die.net/man/7/inotify

Proporcionará notificaciones para (desde la página de manual anterior):

IN_ACCESS
File was accessed (read) (*).

IN_ATTRIB
Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).

IN_CLOSE_WRITE
File opened for writing was closed (*).

IN_CLOSE_NOWRITE
File not opened for writing was closed (*).

IN_CREATE
File/directory created in watched directory (*).

IN_DELETE
File/directory deleted from watched directory (*).

IN_DELETE_SELF
Watched file/directory was itself deleted.

IN_MODIFY
File was modified (*).

IN_MOVE_SELF
Watched file/directory was itself moved.

IN_MOVED_FROM
File moved out of watched directory (*).

IN_MOVED_TO
File moved into watched directory (*).

IN_OPEN
File was opened (*).

información relacionada