iNotify 是Linux 2.6 内核中的文件系统变化通知机制,Android 1.6版本便已基于Linux 2.6.29内核,自带集成了这个强大的功能。
- 既可以监视文件,也可以监视目录
- 不需要对被监视的目标打开文件描述符,资源占用少
- 可以监视的文件系统事件包括:
Event | 描述 |
IN_ACCESS | 即文件被访问 |
IN_MODIFY | 文件被 write |
IN_ATTRIB | 文件属性被修改chmod、chown、touch 等 |
IN_CLOSE_WRITE | 可写文件被 close |
IN_CLOSE_NOWRITE | 不可写文件被 close |
IN_OPEN | 文件被 open |
IN_MOVED_FROM | 文件被移走,如 mv |
IN_MOVED_TO | 文件被移来,如 mv、cp |
IN_CREATE | 创建新文件 |
IN_DELETE | 文件被删除,如 rm |
IN_DELETE_SELF | 自删除,即一个可执行文件在执行时删除自己 |
IN_MOVE_SELF | 自移动,即一个可执行文件在执行时移动自己 |
IN_UNMOUNT | 宿主文件系统被 umount |
IN_CLOSE | 文件被关闭,等同于(IN_CLOSE_WRITE 、IN_CLOSE_NOWRITE) |
IN_MOVE | 文件被移动,等同于(IN_MOVED_FROM 、IN_MOVED_TO) |
2、怎么把iNotify用起来?
2.1. 使用 inotify 的第一步是创建 inotify 实例
int fd = inotify_init ();
- 返回inotify实例的文件描述符
2.2.添加一个watch
int wd = inotify_add_watch (fd, path, mask);
- fd就是inotify实例描述符
- path为监听目录或文件
- mask是事件的掩码
- wd是watch对象的描述符
2.3. 获取文件事件
事件用一个 inotify_event 结构表示
struct inotify_event {
__s32 wd; /* watch descriptor */
__u32 mask; /* watch mask */
__u32 cookie; /* cookie to synchronize two events */
__u32 len; /* length (including nulls) of name */
char name[0]; /* stub for possible name */
};
read读取事件
size_t len = read (fd, buf, BUF_LEN);
- buf 是一个 inotify_event 结构的数组指针
- BUF_LEN 指定要读取的总长度,buf 大小至少要不小于 BUF_LEN
- len 为实际读取的字节数,即获得的事件的总长度。对buf解析即可用得到inotify_event事件
2.4 移除watch
int ret = inotify_rm_watch (fd, wd);
- fd 是 inotify_init() 返回的文件描述符,
- wd 是 inotify_add_watch() 返回的 watch 描述符
beagle 是 GNOME 的桌面搜索引擎项目,inotify 的引入就是完全受它的驱动而做的。对于桌面搜索引擎,它一般作为一个优先级很低的后台进程运行, 只有在系统没有其他任务可运行时才被调度执行,桌面搜索引擎的主要用途就是为系统的文件系统的文件建立索引数据库,以便用户在需要某文件但又想不起存放在哪里时能够根据某些关键字或特征快速地搜索到需要的文件,就象使用网络搜索引擎 google 一样便捷。文件系统有个特点就是只有某些文件会变化,因此桌面搜索引擎在第一次建立完索引数据库后,没必要重复遍历所有的文件建立新的索引,它只需要更新修改了的文件的索引,建立新增加的文件的索引,删除已经删除的文件的索引就足够了,这样桌面搜索引擎需要做的工作就大大地减少。Inotify 就是为这一意图专门设计的,beagle 为需要监视的目录或文件创建了inotify 实例,然后它就等待该 inotify 上发生文件系统事件,如果没有任何文件变化,beagle 将不需要任何开销,只有在有被监视的事件发生时,beagle 才被唤醒并根据实际事件来更新对应的文件的索引,然后继续睡眠等待下一个文件系统事件发生。在 SuSe 9.3 和即将发布的 10.0 中就包含了该桌面搜索引擎,它能够为文档、email、音乐、图象和应用等建立索引。使用过 windows 下的桌面搜索引擎的读者对 google 和 yahoo 以及 Microsoft 的桌面搜索引擎有深刻的体会,感兴趣读者可以安装 SuSe 使用一下。