下载
链接:https://pan.baidu.com/s/1jt6TqwWv5e9qsDK5Roi4mw 密码:vdab
配置
描述
inotify机制可用于监控文件或目录。当监控目录时,与该目录自身以及该目录下面的文件都会被监控,其上有事件发生时都会通知给应用程序。
inotify监控机制为非递归,若应用程序有意监控整个目录子树内的事件,则需对该树中的每个目录发起inotify_add_watch()调用。
可使用select(),poll(),epoll()以及由信号驱动的I/O来监控inotify文件描述符。
API
该函数创建一个新的inotify实例。返回值为一个文件描述符。
name为监控所对应的文件或者目录。mask为一位掩码,针对name定义了想要监控的事件,返回值为一个用于唯一指代此监控项的描述符。
inotify事件
读取inotify事件
示例
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/inotify.h>
int parse_filename(char *name)
{
int len = strlen(name);
char *num = "4913";
for (int i = 0;i<len - 1;i++){
if (name[0] == '.' || name[len - 1] == '~'){
return 0;
} else if (!strcmp(name, num)){
return 0;
}
}
return 1;
}
int read__inotify_fd(int fd)
{
int ret;
char event_buf[1024];
int event_size;
int event_pos = 0;
struct inotify_event *event;
char *move_from = 0;
ret = read(fd, event_buf, sizeof(event_buf));
if(ret < (int)sizeof(*event)) {
if(errno == EINTR)
return 0;
printf("could not get event, %s\n", strerror(errno));
return -1;
}
while(ret >= (int)sizeof(*event)) {
event = (struct inotify_event *)(event_buf + event_pos);
if (parse_filename(event->name)){
if(event->len) {
if(event->mask & IN_DELETE) {
printf("delete file: %s\n", event->name);
} else if (event->mask & IN_CREATE){
printf("create file:%s\n", event->name);
} else if (event->mask & IN_CLOSE_NOWRITE) {
printf("close now rite file:%s\n", event->name);
}else if (event->mask & IN_CLOSE_WRITE) {
printf("close write file: %s\n", event->name);
}
}
}
event_size = sizeof(*event) + event->len;
ret -= event_size;
event_pos += event_size;
}
return 0;
}
void *scan_thread(void *args)
{
int inotify_fd;
int events = 0
int ret = 0;
inotify_fd = inotify_init();
if (inotify_fd < 0){
printf("inotify_init error\n");
return NULL;
}
if (!events){
events = IN_ALL_EVENTS;
}
ret = inotify_add_watch(inotify_fd, "../dir", events);
while (1){
read__inotify_fd(inotify_fd);
}
return NULL;
}
int run_scan()
{
pthread_t tid;
int ret;
ret = pthread_create(&tid, NULL, scan_thread, (void *)&tid);
if (ret != 0){
printf("create scan pthread error:%s\n", strerror(errno));
return -1;
}
return 0;
}
int main(int argc, char *argv[])
{
run_scan();
while(1);
return 0;
}