美文网首页
inotify用法举例

inotify用法举例

作者: 客昂康 | 来源:发表于2019-04-25 19:05 被阅读0次
    • inotify相关接口
    //结构体
    struct inotify_event {
        int      wd;       //被监视的目录或文件的标识符
        uint32_t mask;     //事件位标记
        uint32_t cookie;   //
        uint32_t len;      //name字段占用的字节数
        char     name[];   //发生事件的文件夹或文件的名字
    };
    
    //接口函数
    int inotify_init(void);
    int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
    int inotify_rm_watch(int fd, int wd);
    int read(int fd, void *buf, size_t count);
    int close(int fd);
    
    

    inotify 用来监视文件系统事件,可以监视单个文件,也可以监视目录文件,以及目录内的文件。更详细的信息敲命令"man 7 inotify"
    inotify_init():在内核中创建一个 inotify 实例并返回一个文件描述符。
    inotify_add_watch():向 inotify 添加一个要监视的文件或目录,可以添加多个。
    inotify_rm_watch():从 inotify 中移除一个被监视的文件或目录。
    read(): 从 inotify 中读取 n 个文件系统事件 struct inotify_event
    close():关闭 inotify 实例。
    mask包含如下值:

    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           文件被打开
    
    • 监视键鼠插拔示例代码
      键盘鼠标设备位于/dev/input/目录下,设备名叫做event0event1event2 ...
    //==============================================================================
    //  Copyright (C) 2019 王小康. All rights reserved.
    //
    //  作者: 王小康
    //  描述: inotify用法举例
    //  日期: 2019-04-25
    //
    //==============================================================================
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/inotify.h>
    
    int main(int argc, char *argv[]){
        
        //创建 inotify 实例
        int inotifyFd = inotify_init();
        if(inotifyFd < 0) return -1;
        
        //添加要监视的目录 "/dev/input", 监视 IN_CREATE 事件和 IN_DELETE 事件。
        int err = inotify_add_watch(inotifyFd, "/dev/input", IN_CREATE | IN_DELETE);
        if(err < 0){
            close(inotifyFd);
            return -2;
        }
        
        //开始监视,50次后退出。
        int i, length, offset;
        unsigned char buffer[256];
        struct inotify_event *event;
        for(i=0; i<50; i++){
            length = read(inotifyFd, buffer, 256);
            if(length <= 0) break;
            
            offset = 0;
            while(offset <= length){
                event = (struct inotify_event*)(buffer + offset);
                if(memcmp(event->name, "event", 5) == 0){
                    if(event->mask & IN_CREATE){
                        printf("\e[34m + /dev/input/%s \e[0m\n", event->name);
                    }
                    if(event->mask & IN_DELETE){
                        printf("\e[36m - /dev/input/%s \e[0m\n", event->name);
                    }
                }
                offset += sizeof(struct inotify_event) + event->len;
            }
        }
        
        close(inotifyFd);
        return 0;
    }
    
    
    • 运行效果
      "+ /dev/input/event*"代表插入一个键鼠设备,"- /dev/input/event*" 代表拔出一个键鼠设备。

    相关文章

      网友评论

          本文标题:inotify用法举例

          本文链接:https://www.haomeiwen.com/subject/qiczgqtx.html