inotify用法举例

  • 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 
#include 
#include 
#include 

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用法举例)