Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6270120
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2014-02-09 10:22:56

原文地址:Linux内核特性inotify 作者:nanye1984

    

    
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


监视的文件系统事件

  • 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.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。



参考:
阅读(608) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~