Inotify

Terminología

- Watch: objeto que nos permite monitorizar un fichero

Descripción del módulo InotifyHandler

InotifyHandler se encarga de monitorizar distintos tipos de eventos en ficheros y directorios y notificar estos cambios a los módulos que lo necesiten/soliciten
Los eventos que se notifican son modificaciones,borrados y creación de nuevos ficheros o directorios(en principio)
Este módulo debe ofrecer la posibilidad de añadir y eliminar ficheros y directorios a la lista de elementos monitorizados, gestionar los eventos que se producen en éstos y ofrecer la funcionalidad de monitorizar directorios recursivamente( al monitorizar un directorio, automáticamente los subdirectorios que contenga pasarán a estar monitorizados)

Abstracción al problema

Tenemos un conjunto de ficheros y directorios y queremos conocer instantáneamente si han sufrido modificaciones(ya sea de contenido en caso de ficheros, de estructura en caso de directorios o de eliminación en ambos). Además esta lista puede modificarse dinamicamente, añadiendo nuevos elementos o quitándolos. Existe también una "lista negra" con archivos que no se deben monitorizar que se debe tener en cuenta a la hora de enviar notificaciones a otros módulos de HD Lorean

Abstracción a la solución

Los ficheros y directorios que van a ser monitorizados se añaden a un vector y se añaden watchers a inotify para que se nos notifiquen los eventos deseados. Si en tiempo de ejecución se desean añadir o quitar elementos solamente será necesario añadir o quitar los watches correspondientes.
Las notificaciones serán procesadas para compartirlas con otros módulos, si un fichero de la lista negra notifica un evento no se propagará a otros módulos.

Tecnologías empleadas

Para la implementación de este modulo usaremos inotify-cxx, que ofrece una interfaz orientada a objetos para trabajar con inotify

Inotify

Inotify es una librería que permite conocer en tiempo real diversos eventos producidos en ficheros y directorios

Inotify-cxx

Esta librería aporta a orientación a objetos a las utilidades que ofrece inotify

Opciones investigadas

Inotify-cxx

Ejemplo de uso:
Vamos a monitorizar el borrado de un directorio. Para ello creamos un objeto InotifyWatch que contiene la información necesaria para controlar los eventos(la ruta del directorio y la máscara del evento a notificar).
Ese objeto se añade a un objeto Inotify que es quien se encarga de notificar los eventos, por medio de objetos del tipo InotifyEvent, en los que se almacena, entre otras cosas, quien provocó la notificación y por qué motivo

int main(){
    InotifyWatch* watch;
    watch = new InotifyWatch("/home/user/prueba/",IN_DELETE);
    InotifyWatch* fichero;
    Inotify* n = new Inotify(); 
    InotifyEvent* pEvt;
    pEvt = new InotifyEvent();
    n->Add(watch);
    n->WaitForEvents();
    n->GetEvent (pEvt);
    if(pEvt->IsType(IN_DELETE))
        cout << "Borrado Directorio, saliendo" << '\n';
    }

Conclusiones:

Nos hemos limitado a investigar la librería inotify-cxx ya que ofece la misma funcionalidad que la librería inotify(que era la primera opción que nos planteamos para resolver este problema) pero con la ventajas que ofrece la programación orientada a objetos. En contraposición a estas ventajas, la velocidad de ejecución del algoritmo al usar esta librería probablemente será inferior a usar directamente inotify

Opinión personal

Inotify no ofrece una solución completa. Los watches recursivos no están soportados. Si tenemos un directorio monitorizado solo se notificarían eventos ocurridos dentro de ese directorio, y no en los subdirectorios que estén contenidos en él.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License