- 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/
目录下,设备名叫做event0
、event1
、event2
...
//==============================================================================
// 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*"
代表拔出一个键鼠设备。
网友评论