下载
链接: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; }