Bonjour à tous,
je ne sais pas si vous connaissez inotify alors je vais rappeler rapidement ce que c'est. Inotify est un module inclu dans le kernel qui permet la surveillance de fichiers/répertoires. Le premier "i" d'inotify voulant dire inode.
Il existe un binding entre Ocaml et C pour faire fonctionner inotify en CAML.
Je suis en train d'écrire un programme en OCAML et je souhaiterais m'appuyer sur inotify pour surveiller les dossiers.
Ce que mon programme fait, c'est de prendre en entrée le path d'un dossier et d'aller chercher récursivement les sous-dossiers et appliquer à eux aussi la surveillance.
Pour surveiller un dossier, il faut utiliser la fonction Inotify.add_watch qui retourne un identifiant unique appelé "wd".
Enfin quand je crée un dossier dans un répertoire surveillé, ca génère un évènement qui ressort un "wd" ce qui me permet de savoir quel est le path du dossier où s'est produit l'évènement.
Pour mettre le nouveau répertoire sous surveillance, il suffit alors de récupérer le path du dossier où il y a eu l'évènement grâve à l'association wd -> path et de concaténer à path le nom du nouveau dossier.
Mais dans ma belle explication quelque chose m'échappe, voyez plutôt la session qui suit :
Exemple de session :
mkdir "/tmp/dev" :
add_watch "/tmp/dev" -> wd = 1
mkdir "/tmp/dev/hello" :
add_watch "/tmp/dev/hello" -> wd = 2
mkdir "/tmp/dev/world" :
add_watch "/tmp/dev/world" -> wd = 3
mkdir "/tmp/dev/salut" :
add_watch "/tmp/dev/salut" -> wd = 4
Jusqu'ici c'est normal puis je crée des répertoires un niveau en dessous :
mkdir "/tmp/dev/hello/bonjour" :
add_watch "/tmp/dev/hello/bonjour" -> wd = 2 ---> wd devrait valoir 5 !
mkdir "/tmp/dev/hello/bye" :
add_watch "/tmp/dev/hello/bonjour/bye" -> wd = 2 ----> wd devrait valoir 6 !
Comme on peut le voir à l'erreur, on ne récupère pas le bon wd et du coup, la concaténation met en évidence le fait que ca foire.
Qu'est-ce qui échoue ? Apparemment l'incrémentation ? J'ai parcouru le code du binding qui mène finalement au code C et l'incrément du wd se fait par la fonction kernel atom_inc. Donc je ne pense pas que le problème se situe de ce côté et puis depuis le temps qu'inotify est sorti, ca se saurait surement.
C'est donc surement moi qui fait une erreur. Si wd qui est pourtant unique n'est pas la bonne méthode pour savoir où s'est situé l'évènement, quelle est la bonne méthode ?
Ci-joint, j'ai mis mon programme de tests (avec création des répertoires dans /tmp/dev, vous pouvez le commenter et les créer à la main si vous le souhaitez) ainsi qu'un Makefile.
Merci d'éclairer ma lanterne.
PS: les fichiers joints ont l'extension .txt mais c'est uniquement pour pouvoir les uploader. Sinon le site refuse l'extension .ml
Partager