• linux下inotify的使用


    有时候我们需要检测某个目录下文件或者子目录的改动状况,如添加、删除、以及更新等,Linux系统上提供了inotify来完成这个功能。inotify是在版本2.6.13的内核中首次出现,现在的发行本应该都包含这个系统调用了。

    下面的描述中的文件如无特别说明包括文件以及目录

    使用inotify的第一步就是调用inotify_init()创建一个inotify实例,该函数返回一个文件描述符。这个文件描述符关联了一个inotify事件队列,通过read读取该文件描述符,就能获取底层的inotify事件。

    int inotify_fd = inotify_init();

    还有另外一个系统调用inotify_init1(int flag),该函数提供了一个参数可用于设置文件描述符属性

    int inotify_fd = inotify_init1(flag);

    其效果与如下代码相同

    int inotify_fd = inotify_init();
    fcntl(inotify_fd, F_SETFL, flags)

    一旦成功创建了inotify实例,获得了相应的文件描述符,下一步就是告诉内核需要关注的文件以及关注的事件类型。这一步是通过函数inotify_add_watch()实现的。

    int wd = inotify_add_watch(instance_fd, file_name, event_mask)

    上面的调用中,file_name就是需要关注的文件,而event_mask是关注的事件类型掩码。目前inotify支持的事件类型包括如下几种

    IN_ACCESS
    IN_ATTRIB
    IN_CLOSE_WRITE
    IN_CLOSE_NOWRITE
    IN_CREATE
    IN_DELETE
    IN_DELETE_SELF
    IN_MODIFY
    IN_MOVE_SELF
    IN_MOVED_FROM
    IN_MOVED_TO
    IN_OPEN

    这里面值得注意的是IN_DELETE、IN_MOVE_TO和IN_DELETE_SELF、IN_MOVE_SELF,简单来说带有SELF结尾的事件,发生在被关注目录自身,而不带SELF的发生在关注对象的子目录或者子文件之上。例如对于目录A调用inotify_add_watch,如果目录A中的文件B被删除,内核会发出IN_DELETE事件,而目录A被删除,内核发出IN_DELETE_SELF事件。
    如果决定不再关注某个文件,只需调用inotify_rm_watch(instance_fd, wd)即可,其中的wd为inotify_add_watch的返回值。

    设置好了关注文件以及事件类型,剩下的就是inotify事件的处理了。
    首先第一步就是要获取inotify事件,这一步非常简单,只需要对于instance_fd调用read进行读取即可。注意,read读出的数据只是一些字符序列,你要通过强制转换才能获得inotify_event

    struct inotify_event {
    int wd;
    uint32_t mask;
    uint32_t cookie;
    uint32_t len;
    char name[]
    };

    具体的含义可以使用man命令去看,值得一体的是mask字段和cookie字段。这里的mask字段除了包含事件类型之外,还可能包含其他信息,诸如IN_ISDIR标示事件是否是发生在目录之上,IN_UMOUNT标示关注对象所在文件系统是否被卸载等。

    Windows下也有类似的系统调用ReadDirectoryChanges,不过我在FreeBSD以及AIX下都未找到相应的系统调用

  • 相关阅读:
    mysql索引
    数据库修复
    数据库取值 三级分类后台遍历
    创建数据库!
    mysql按条件 导出sql
    nodejs 简单安装环境
    C++ 性能剖析 (一)
    C++ 性能剖析 (二):值语义 (value semantics)
    JavaScript Nested Function 的时空和身份属性
    C++ Reference 的“三位一体”诠释
  • 原文地址:https://www.cnblogs.com/jimmychange/p/3498862.html
Copyright © 2020-2023  润新知