使用inotify API有以下几个关键步骤
1. 应用程序使用inotify_init()来创建一个inotify实例,该系统调用返回的文件描述符用于在后续操作中指代该实例
2. 应用程序使用inotify_add_watch()向inotify实例的监控列表添加条目
3. 为获得事件通知,应用程序需要针对inotify文件描述符执行read()操作。每次对read()的成功调用,都会返回一个或多个inotify_event结构,其中各自记录了处于inotify实例监控之下的某一路径名所发生的事件
4. 应用程序在结束监控时会关闭inotify文件描述符,这会清除与inotify实例相关的所有监控项
inotify监控为非递归
可以使用select(), poll(), epoll(), 以及由信号驱动的I/O来监控inotify文件描述符
inotify相关api如下:
-
#include <sys/inotify.h>
-
int inotify_init(void);
-
/*returns file descriptor on success, or -1 on error*/
-
int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
-
/*returns watch descriptor on success, or -1 on error*/
-
int inotify_rm_watch(int fd, uint32_t wd);
-
/*returns 0 on success, or -1 on error*/
成功读取后返回的inotify_event结构如下所示:
-
struct inotify_event{
-
int wd;
-
uint32_t mask; /*bits describing event that occurred, 上表out列为Y的值*/
-
uint32_t cookie; /*cookie for related events (for rename())*/
-
uint32_t len; /*size of name field*/
-
char name[]; /*optional null-terminated filename */
-
};
对inotify事件做排队处理,需要消耗内核内存。正因如此,内核会对inotify机制的操作施加各种限制,超级用户可以配置/proc/sys/fs/inotify路径中的三个文件来调整这个限制:
1. max_queued_events: 实例队列中的事件数量设置上限。一旦超出上限,系统会生成IN_Q_OVERFLOW事件
2. max_user_instances:对由每个真是用户ID创建的inotify实例数的限制
3. max_user_watches:对由每个真是用户ID创建的监控项数量的限制
阅读(1176) | 评论(0) | 转发(0) |