INotify

INotify是Linux内核提供的一种文件系统变化通知机制。它可以为应用程序监控文件系统的变化,如文件的新建、删除、读写等。

INotify机制有两个基本对象,分别为inotify对象与watch对象,都使用文件描述符表示。

inotify对象对应一个队列,应用程序可以向inotify对象添加多个监听。当被监听的事件发生时,可以通过read()函数从inotify

对象中将事件信息读取出来。Inotify对象可以通过以下方式创建:

int mINotifyFd = inotify_init();

而watch对象则用来描述文件系统的变化事件的监听。它是一个二元组,包括监听目标和事件掩码两个元素。监听目标是文件系统的一个

路径,可以是文件也可以是文件夹。而事件掩码则表示了需要监听的事件类型,掩码中的每一位代表一种事件。可以监听的事件种类很多,

其中就包括文件的创建(IN_CREATE)与删除(IN_DELETE).

以下代码即可将一个用于监听输入设备节点的创建与删除的对象添加到inotify对象中:

static const char *DEVICE_PATH = "/dev/input"

int result = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE);

完成上述watch对象的添加后,当/dev/input/下的设备节点发生创建与删除操作时,都会将相应的事件信息写入inotify对象中,此时可以

通过read()函数从inotify描述符中将事件信息读取出来。

事件细腻使用结构体inotify_event进行描述

struct inotify_event {
  __s32 wd;         /* 事件对应的watch对象的描述符 */
  __u32 mask;       /* 事件类型,如文件被删除,此处的值为IN_DELETE */
  __u32 cookie;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 len;        /* name字段的长度 */
  char name[0];     /* 可变长的字段,用于存储产生事件的文件路径 */
}

当监听事件发生时,可以通过如下方式讲一个或多个未读取事件信息读取出来:

int res;

char event_buf[512];

res = read(mINotifyFd, event_buf, sizeof(event_buf));

其中event_buf是inotify_event的数组指针,能读取的事件量取决于数组的长度。成功读取事件信息后,便可根据inotify_event

结构体的字段判读事件类型以及事件产生的文件路径

总结INotify机制的使用过程

通过inotify_init()创建一个inotify对象

通过inotify_add_watch()将一个或多个监听添加到inotify对象中

通过read()函数从inotify对象中读取监听事件。当没有事件发生时,inotify对象中无任何可读数据

通过INotify机制避免了轮询文件系统的麻烦,但是INotify机制并不是通过回调的方式通知事件,而需要使用者主动从inotify对象

中进行事件读取。