19 de octubre de 2005

inotify

El otro día en un thread sobre inotify se leia una cosa interesante. El jugo de inotify es monitorizar cosas sobre inodos. Entre otras cosas, puedes decirle a inotify, con IN_DELETE_SELF, que te avise de cuando un archivo va a ser borrado

Y aquí venía el problema curioso. Inotify vigila a los inodos, y como buen sistema unix, en linux la ruta "/foobar/archivo" no es mas que un "enlace" a un inodo. Puedes borrar ese enlace a ese inodo para borrar el archivo, puedes hacer que apunte a otro inodo, pero el inodo antiguo seguirá ahí y puedes seguir escribiendolo o leyendolo (razón por la cual en unix es posible sobreescribir un archivo mientras está abierto, ej: al actualizar paquetes)

Y ahí está el problema: Si quieres "espiar" con inotify y con IN_DELETE_SELF el momento de borrado de un archivo, te encontrarás con que despues de hacer un "rm" inotify no notifica nada porque el inodo aun existe. El problema es que en unix no puedes monitorizar el borrado de un archivo monitorizando inodos (y por tanto, con inotify) - unix no funciona asi. Asi que como bien dijo linus, la propia existencia de IN_DELETE_SELF es estúpida. No es un defecto de unix ni de inotify: Es una consecuencia del diseño de unix, asi que como dice linus en el mensaje, si quieres monitorizar el borrado de un archivo no tendras mas remedio que monitorizar al directorio. Aunque parece absurdo a primera vista (al menos a mis ojos), esa es la manera "correcta" de hacerlo en unix. Me parecia algo curioso para comentar.

No hay comentarios:

Publicar un comentario