Linux内核特性inotify

5550阅读 0评论2014-01-29 nanye1984
分类:LINUX

    

    
Inotify 是一个 Linux 内核
特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。

作用


注意:
            (1) inotify API是linux系统调用接口,不遵循POSIX标准
            (2)
Linux系统内核是否达到了2.6.13以上

检查是否支持inotify的两种方法:

    
  (1)/proc/sys/fs/inotify目录下存在max_queued_events、max_user_instances、max_user_watches文件说明系统支持inotify
            (2)如果输出('CONFIG_INOTIFY_USER=y'),那么你可以马上享受Inotify之旅了。
% grep INOTIFY_USER /boot/config-$(uname -r)
    CONFIG_INOTIFY_USER=y



接口

           #include
           int inotify_init(void);             
           int inotify_init1(int flags);
           int inotify_add_watch(int fd, const char *pathname, uint32_t mask);    
           int inotify_rm_watch(int fd, int wd);
    
       接口不需要做什么说明,具体的细节看manpage手册,上面已经说的足够详细了。
使用 inotify 很简单:创建一个文件描述符,附加一个或多个监视器(一个监视器 是一个路径和一组事件),然后使用 read 方法从描述符获取事件。read 并不会用光整个周期,它在事件发生之前是被阻塞的。更好的是,因为 inotify 通过传统的文件描述符工作,您可以利用传统的 select 系统调用来被动地监控监视器和许多其他输入源。两种方法 — 阻塞和使用 select— 都避免了繁忙轮询

相关参数

    inotify定义了下列的参数,可以用来限制inotify使用内核内存的大小。
       /proc/sys/fs/inotify/max_queued_evnets     
           表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
       /proc/sys/fs/inotify/max_user_instances
            表示每一个real user ID可创建的inotify instatnces的数量上限。
       /proc/sys/fs/inotify/max_user_watches
            表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:
             echo 30000000 > /proc/sys/fs/inotify/max_user_watches


监视的文件系统事件


内核实现

    
2.6.31版本的内核中对notify进行了一番大的改动,将原来的inotify和dnotify这两个不想关的特性进行了抽象,将它们的共同的点抽象成了一个基础设施,这个基础设施就是fsnotify.其实,fsnotify并没有什么难于理解的,它甚至比原来的inotify和dnotify更加简单了,这次的这个更新仅仅更新了机制而没有更新策略,也就是用户接口并没有任何的变化。如果说有人理解kernel中的device和device_driver体系以及input子系统的话,那么这个fsnotify就不难理解了。    
    notify实现机制的代码在fs/notify/下,其中fsnotify就由此目录下的fs/notify/fsnotify.h 、fs/notify/group.c、fs/notify/inode_mark.c、fs/notify/mark.c、fs/notify/notification.c、fs/notify/vfsmount_mark.c、和头文件include/linux/fsnotify.h、include/linux/fsnotify_backend.h实现。而fs/notify/dnotify/, fs/notify/fanotify/和fs/notify/inotify/则分别实现了dnotify, fanotify, inotify。



参考:
上一篇:Linux动态库与静态库制作及使用详解
下一篇:VFS文件系统结构分析