inotify的安装与使用

下载

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

猜你喜欢

转载自blog.csdn.net/qq_33408113/article/details/80345477
今日推荐