inotify框架的使用和原理!如何添加对于目标文件的watch呢?.doc
《inotify框架的使用和原理!如何添加对于目标文件的watch呢?.doc》由会员分享,可在线阅读,更多相关《inotify框架的使用和原理!如何添加对于目标文件的watch呢?.doc(6页珍藏版)》请在三一文库上搜索。
1、inotify框架的使用和原理!如何添加对于目标文件的watch呢?1. 概论inotify是Linux中用于监控文件系统变化的一个框架,不同于前一个框架dnotify, inotify可以实现基于inode的文件监控。也就是说监控对象不再局限于目录,也包含了文件。不仅如此,在事件的通知方面,inotify摈弃了dnotify的信号方式,采用在文件系统的处理函数中放置hook函数的方式实现。2. 用户层2.1 数据结构在inotify中,对于一个文件或目录的监控被称为一个watch。 给某一个文件或目录添加一个watch就表示要对该文件添加某一类型的监控。监控的类型由一个掩码Mask表示,ma
2、sk有:IN_ACCESS : 文件的读操作IN_ATTRIB : 文件属性变化IN_CLOSE_WRITE : 文件被关闭之前被写IN_CLOSE_NOWRITE : 文件被关闭IN_CREATE : 新建文件IN_DELETE : 删除文件IN_MODIFY : 修改文件IN_MOVE_SELF : 被监控的文件或者目录被移动IN_MOVED_FROM : 文件从被监控的目录中移出IN_MOVED_TO : 文件从被监控的目录中移入IN_OPEN : 文件被打开事件的类型有了,我们还需要一个结构体去表示一次事件, 在用户空间,inotify使用inotify_event表示一个事件,每一个
3、事件都有一个特定的身份标示wd, wd是一个整型变量。每一个事件都有一组事件类型与其关联(IN_CREATE | IN_OPEN)。 事件中还应包含文件名。struct inotify_event int wd;/* Watch descriptor */uint32_t mask;/* Mask of events */uint32_t cookie;/* Unique cookie associating relatedevents (for rename(2) */uint32_t len;/* Size of name field */char name;/* Optional nul
4、l-terminated name */;2.2函数及inotify的使用为了防止文件描述符fd的快速消耗,inotify提出了一个inotify instance(inotify实例)的概念。每一个inotify实例表示一个可读写的fd, 一个inotify实例链接有多个对于文件的watch。而函数inotify_init的工作就是生成一个inotify实例。如何添加对于目标文件的watch呢?使用inotify_add_watch完成该任务,inotify_add_watch有三个参数,第一个参数是该watch所属的实例的fd, 第二个参数是被监控的文件名,第三个参数要监控的事件类型。有添
5、加就有删除, inotify_rm_watch(int fd, int wd)完成watch的删除工作,类似的, fd表示实例,wd表示即将删除的watch.void handle_event(int fd)for(;)int len =0;char bufBUFSIZE;read(fd, buf, BUFSIZE);int i =0;char*p;for(p = buf; p len)event =(struct inotify_event *)p;if(event - mask printf(IN_OPENn);int main(void)int fd;if(fd = inotify_in
6、it()int inotify_init(void);int inotify_init1(int flags);int inotify_add_watch(int fd,constchar*pathname,uint32_t mask);int inotify_rm_watch(int fd,int wd);3. 内核原理3.1 hook函数inotify通过在文件系统的操作函数(vfs_open, vfs_unlink等)中插入hook函数改变代码的执行路径,从而产生相应的事件。以下是一个hook函数的列表:图3-1 下图是sys_open函数的函数调用流程,可以看到sys_open函数调用
7、的是fsnotify_open函数去处理open事件。而fsnotify又调用inotify_dentry_parent_queue_event函数和inotify_inode_queue_event函数.图3-2其中inotify_dentry_parent_queue_event本身也调用了inode_queue_event函数,只是参数不同罢了.图3-3可见在inotify_dentry_parent_queue_event中,第一个参数变成了被监控目录的父目录的inode. 关于这两个函数,我们先按下不表, 留待后文再说.3.2 inotifyfs (inotify.c)在内核中ino
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- inotify 框架 使用 原理 如何 添加 对于 目标 文件 watch
链接地址:https://www.31doc.com/p-3253003.html