fanotify
, construido en la parte superior de fsnotify
, se supone que debe reemplazar inotify
que reemplazó dnotify
. ¿Hay algunos buenos ejemplos de programación o utilidades existentes que usan fanotify
para observar los cambios en un sistema de archivos? ¿Cuánto detalle ofrece fanotify
?¿Cómo programo la nueva función de supervisión del sistema de archivos `fanotify` de Linux?
Respuesta
Acabo de enterarme de fanotify y me parece muy agradable. Muy buena interfaz!
Aún no está en el árbol de Linus, pero supongo que llegará allí para Linux 2.6.33 y antes para probarlo (hoy noté algunos parches en LKML). En el parche original anuncian un árbol GIT por lo que es posible que puedas construir un kernel de prueba desde allí. También puede encontrar pruebas de git trees.
No pude encontrar las utilidades que lo usan pero supongo que vendrán pronto.
Hay un ejemplo aquí, al final del correo electrónico:
http://lwn.net/Articles/339253/
Si usted está realmente interesado en esta nueva característica es posible que desee controlar la lista de correo del kernel de Linux e interactuar allí. También puede esperar hasta que se liberen los servicios o desarrolle los suyos propios.
Sobre el detalle, parece que el fanotify proporciona menos eventos que inotify. Supongo que esto podría cambiar en el futuro, pero dado que esta es una característica nueva en el desarrollo, no hay mucho que pueda decir al respecto ahora.
Al final, el fanotify entró en 2.6.36 –
This LWN article a menudo se cita como una fuente de documentación para fanotify. Pero la descripción allí parece estar desactualizada. el fanotify ya no funciona con una conexión de socket. En cambio, hay dos nuevas funciones libc que envuelven syscalls, declaradas en sys/fanotify.h
. Uno se llama fanotify_init
, el otro es fanotify_mark
. En el momento de escribir estas líneas, estas llamadas a los sistemas todavía se incluyen en el list of missing manual pages. Sin embargo, hay un mail containing drafts para estas páginas de manual. Con una combinación de estas páginas man, un vistazo a los encabezados en cuestión, y un poco de prueba y error, debería ser capaz de poner esto en marcha.
Parece que algunas de las funciones previstas originalmente para fanotify ya no se suipportan de esa manera. Por ejemplo, el artículo LWN describe una bandera FAN_GLOBAL_LISTENER
que marcará implícitamente todo el árbol del sistema de archivos a menos que las partes estén explícitamente sin marcar. La interfaz actual no tiene tal disposición, sino un resultado similar se puede conseguir utilizando la siguiente marca:
fanotify_mark(fan,
FAN_MARK_ADD | FAN_MARK_MOUNT,
FAN_OPEN | FAN_EVENT_ON_CHILD,
AT_FDCWD, "/")
Dónde eventos inotify proporcionan la ruta de acceso al objeto visitada como parte del evento, fanotify abre un descriptor para su . Para convertir este descriptor en un nombre de ruta, se puede usar la entrada correspondiente del sistema de archivos proc, como se describe en here.
Aquí está un ejemplo simple que simplemente imprime el nombre de cada archivo abierto:
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/fanotify.h>
#include <sys/stat.h>
#include <sys/types.h>
#define CHK(expr, errcode) if((expr)==errcode) perror(#expr), exit(EXIT_FAILURE)
int main(int argc, char** argv) {
int fan;
char buf[4096];
char fdpath[32];
char path[PATH_MAX + 1];
ssize_t buflen, linklen;
struct fanotify_event_metadata *metadata;
CHK(fan = fanotify_init(FAN_CLASS_NOTIF, O_RDONLY), -1);
CHK(fanotify_mark(fan, FAN_MARK_ADD | FAN_MARK_MOUNT,
FAN_OPEN | FAN_EVENT_ON_CHILD, AT_FDCWD, "/"), -1);
for (;;) {
CHK(buflen = read(fan, buf, sizeof(buf)), -1);
metadata = (struct fanotify_event_metadata*)&buf;
while(FAN_EVENT_OK(metadata, buflen)) {
if (metadata->mask & FAN_Q_OVERFLOW) {
printf("Queue overflow!\n");
continue;
}
sprintf(fdpath, "/proc/self/fd/%d", metadata->fd);
CHK(linklen = readlink(fdpath, path, sizeof(path) - 1), -1);
path[linklen] = '\0';
printf("%s opened by process %d.\n", path, (int)metadata->pid);
close(metadata->fd);
metadata = FAN_EVENT_NEXT(metadata, buflen);
}
}
}
La documentación de la API fanotify está disponible en las páginas de manual de Linux:
- fanotify.7 - http://man7.org/linux/man-pages/man7/fanotify.7.html
- fanotify_init.2 - http://man7.org/linux/man-pages/man2/fanotify_init.2.html
- fanotify_mark.2 - http://man7.org/linux/man-pages/man2/fanotify_mark.2.html
He aquí algunos ejemplos, siendo fatrace el más elaborado.
- https://launchpad.net/fatrace
- http://git.infradead.org/users/eparis/fanotify-example.git
- http://www.lanedo.com/~aleksander/fanotify/fanotify-example.c
enlaces existen para Go y Python.
- 1. Identificación de qué biblioteca del sistema Linux contiene una función
- 2. java 7 preguntas de supervisión del directorio
- 3. Controles de contexto de supervisión en Linux
- 4. Función de supervisión de estado de Weblogic
- 5. Diario del sistema de archivos de Android
- 6. Supervisión del tamaño del directorio de Windows
- 7. Supervisión del progreso de Rsync
- 8. Supervisión de cambios de archivos en C#
- 9. Supervisión de recursos programáticos por proceso en Linux
- 10. Cómo borrar programáticamente la memoria caché de memoria del sistema de archivos en C++ en un sistema Linux?
- 11. Escuchante del sistema de archivos
- 12. Tamaño del bloque del sistema de archivos
- 13. Crear un bucle en un sistema de archivos Linux
- 14. Programación de sistema Linux
- 15. Convertir URL a la ruta del sistema de archivos
- 16. ¿Cómo puedo simular la corrupción del sistema de archivos ext3?
- 17. Windows equivalente a los espacios de nombres de Linux (montajes del sistema de archivos por proceso)?
- 18. de aplicación del sistema de archivos básica
- 19. sistema de archivos de solo lectura en Linux
- 20. Supervisión del progreso utilizando Apache Commons FTPClient
- 21. Cómo depurar el bloqueo del sistema de archivos FUSE en Linux
- 22. PHP detección de la codificación del sistema de archivos
- 23. kernel de Linux: agregue la llamada al sistema de forma dinámica a través del módulo
- 24. vigilante del sistema de archivos y archivos de gran tamaño
- 25. Determinar el dispositivo del sistema de archivos en Python
- 26. ¿Cómo desalojar el archivo de la memoria caché del sistema en Linux?
- 27. Cómo escuchar los cambios del sistema de archivos MAC - kFSEventStreamCreateFlagWatchRoot
- 28. ¿Encriptación del sistema de archivos para iOS?
- 29. Sistema de gestión de versiones para Linux
- 30. Problemas Tamaño de fragmento en Google del sistema de archivos
Solo para su información: Fanotify tiene un error. http://stackoverflow.com/questions/7566755/multi-thread-opening-file-hangs-when-fanotify-is-on aquí hay un parche. http://marc.info/?l=linux-kernel&m=131822913806350&w=2 – user377808