基于redis ae实现 Linux中的文件系统监控机制(inotify)

(英文部分为转的。代码是个人代码)

1 What’s inotify

The inotify API provides a mechanism for monitoring file system events. Inotify can be used to monitor individual files, or to monitor directories. When a directory is
monitored, inotify will return events for the directory itself, and for files inside the directory.

2 How to use inotify

2.1 system calls used with this API

The following system calls are used with this API: inotify_init(orinotify_init1),inotify_add_watch, inotify_rm_watch, read,
and close.

2.1.1 inotify_init

It creates an inotify instance and returns a file descriptor referring to the inotify instance. The more recent inotify_init1 is like inotify_init,
but provides some extra functionality.

2.1.2 inotify_add_watch

It manipulates the "watch list" associated with an inotify instance. Each item ("watch") in the watch list specifies the pathname of a file or directory, along with some set of events that the kernel should
monitor for the file referred to by that pathname.

inotify_add_watch either creates a new watch item, or modifies an existing watch. Each watch has a unique "watch descriptor", an integer returned by inotify_add_watch when
the watch is created.

2.1.3 inotify_rm_watch

It removes an item from an inotify watch list.

When all file descriptors referring to an inotify instance have been closed, the underlying object and its resources are freed for reuse by the kernel; all associated watches are automatically freed.

2.1.4 read

To determine what events have occurred, an application reads from the inotify file descriptor.
If no events have so far occurred, then, assuming a blocking file descriptor, read will block until at least one event occurs (unless interrupted
by a signal, in which case the call fails with the error EINTR; see signal(7)).

Each successful read returns a buffer containing one or more of the following structures:

struct inotify_event {

int      wd;       /* Watch descriptor */

uint32_t mask;     /* Mask of events */

uint32_t cookie;   /* Unique cookie associating related events (for rename ) */

uint32_t len;      /* Size of name field */

char     name[];   /* Optional null-terminated name */

};

2.2 Inotify events

The inotify_add_watch mask argument and the mask field of the inotify_event structure returned
when reading an inotify file descriptor are both bit masks identifying inotify events. The following bits can be specified in mask when calling inotify_add_watch and
may be returned in the mask field returned by read:

IN_ACCESS                             File was accessed (read) (*).

IN_ATTRIB                              Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).

IN_CLOSE_WRITE                  File opened for writing was closed (*).

IN_CLOSE_NOWRITE            File not opened for writing was closed (*).

IN_CREATE                             File/directory created in watched directory (*).

IN_DELETE                             File/directory deleted from watched directory (*).

IN_DELETE_SELF                   Watched file/directory was itself deleted.

IN_MODIFY                            File was modified (*).

IN_MOVE_SELF                      Watched file/directory was itself moved.

IN_MOVED_FROM                 File moved out of watched directory (*).

IN_MOVED_TO                       File moved into watched directory (*).

IN_OPEN                                 File was opened (*).

……

2.3 The flow for the systme calls used with inotify

3 代码演示样例

#include <sys/inotify.h>

static aeEventLoop *loop;
/* 全局的notify watch item */
static const char *wds[10]; 

void sync_file_thread(void*args)
{
	int inotify_fd, wd;
	int poll_num;
	const char *dir, *file;
	dir = "/data/wcl/redis_proxy";
	file = "binlog_1"; 

	loop =aeCreateEventLoop(1024);
	/* 创建inotify instance */
	inotify_fd = inotify_init1(IN_NONBLOCK);
	if (inotify_fd == -1)
	{
		perror("Unable to create inotify instance\n");
		exit(-1);
	}
	printf("inotify_fd [%d]\n",inotify_fd);

	/* 监控文件夹以下的新建文件事件 */
	wd = inotify_add_watch(inotify_fd, dir, IN_CREATE);
	wds[wd] = dir; 

	/* 监控文件夹以下文件的改动事件 */
	wd = inotify_add_watch(inotify_fd, file, IN_MODIFY);
	wds[wd] = file; 

	/* 监听inotify的可读事件, 有可读事件, 则表示监控的文件系统有事件产生 */
	if (aeCreateFileEvent(loop,inotify_fd,AE_READABLE,handle_inotify_events,NULL))
	{
		exit(0);
	}
	aeMain(loop);
	aeDeleteEventLoop(loop);
} 

 void handle_inotify_events(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask)
{
	char buf[4096], *ptr;
	ssize_t len;
	struct inotify_event *event; 

	len = read(fd, buf, sizeof(buf));
	if (len == -1 && errno != EAGAIN)
	{
		perror("read error");
		exit(-1);
	} 

	if (len <= 0)
	{
		return;
	} 

	for (ptr = buf; ptr < buf + len; ptr += sizeof(struct inotify_event) + event->len)
	{
		event = (struct inotify_event *)ptr; 

		if(event->mask & IN_CREATE)
		{
			/* new binlog files created */
			if(event->len)
			{
				printf("New File created: %s\n", event->name);
			}
		} 

		if(event->mask & IN_MODIFY)
		{
			/* existing files are modified */
			printf("File is modified: %s\n", wds[event->wd]);
		}
	} 

}

这里我仅仅监控了创建和改动的两个事件,然后依据文件名称字和一些其它的相应机制进行对文件推断改动等。

时间: 2024-10-11 00:16:29

基于redis ae实现 Linux中的文件系统监控机制(inotify)的相关文章

基于redis AE的异步网络框架

最近一直在研究redis的源码,redis的高效率令人佩服. 在我们的linux机器上,cpu型号为, Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel(R) Pentium(R) CPU G630 @ 2.70GHz 上 set,get 都能达到每秒钟15W的请求处理量,真是佩服这代码的效率. 前几篇文章,主要是介绍了基本的代码,比如字符串处理,链表处理,hash等.这篇文章介绍网络的核心,基于事件反映的异步网络框架. 异步网络处理,是基于epoll的.

linux中proc文件系统 -- ldd3读书笔记

1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生文件的内容.我们已经见到了很多这样的文件,例如,/proc/modules 总是返回当前内核中加载的模块. /proc 广泛的应用在 linux 文件系统中,现代 linux 发行版上的许多应用程序,例如 ps ,top 和 uptime 都从 /proc 获取他们所需要的信息.一些驱动程序也通过

inotify 工具 是一种强大的、细粒度的、异步文件系统监控机制

前言:Inotify是一种强大的.细粒度的.异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性.读写属性.权限属性.删除创建.移动等操作,也就是可以监控文件发生的一切变化. inotify-tools是一个C库和一组命令行的工作提供Linux下inotify的简单接口.inotify-tools安装后会得到inotifywait和inotifywatch这两条命令 inotifywait命令可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装i

linux中关于文件系统的简要介绍和一般操作

创建文件系统--分区格式化    格式化:        低级格式化:            划分磁道        高级格式化:            创建文件系统,按照某种特定的标准,将整个分区划分为大小相同的若干小的逻辑编址单元,每个这样的单元,称为块(Block): 划分块的标准:                在Linux的文件系统中,主要的块划分标准就是:每个块包括2^1或2^2或2^3个扇区:即块大小可以是:1024Byte,2048Byte或者4096Byte: 注意:     

Linux工程师学习资料,Linux中的文件系统树

在Linux中,所有的文件与目录都由根目录/开始.是所有目录与文件的源头.然后再一个一个分支下来,有点像树状结构.而每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的. 在系统中我们会看到/ 目录下有许多目录! 这些目录都是有各自的功能. 那这些目录的功能是什么呢? 我们来看下. 用于存放命令文件 /bin 目录中存放的命令不会对系统造成质的修改,所有用户都可以使用 /sbin 目录中存放的命令会对系统造成修改,大多数命令只能由root使用 boot 用于存放系统启动的引导文件,以及L

Linux 中直接 I/O 机制的介绍

https://www.ibm.com/developerworks/cn/linux/l-cn-directio/ 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O.本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程序地址空间进行传输,所以该文件访问的机制称作为直接 I/O.Linux 中就提供了这样一种文件访问机制,对于那种将 I/O 缓存存放在用户地址空间的应用程序来说,直接 I/O 是一种非常高效的手段.本文将基于 2.

基于redis AE异步网络架构

最近的研究已redis源代码,redis高效率是令人钦佩. 在我们的linux那个机器,cpu型号, Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel(R) Pentium(R) CPU G630 @ 2.70GHz 上 set,get 都能达到每秒钟15W的请求处理量,真是佩服这代码的效率. 前几篇文章.主要是介绍了主要的代码.比方字符串处理,链表处理.hash等. 这篇文章介绍网络的核心,基于事件反映的异步网络框架. 异步网络处理.是基于epoll的.

Linux中详细搭建监控服务zabbix部署

1.Linux服务器安装zabbix监控平台 zabbix是基于web界面的开源分布式监控平台,可以监控各种服务器的配置参数,支持自定义配置和自定义告警,并且可以实现邮件.短信等方式的告警,zabbix基本组件如下: zabbix_server:zabbix服务端守护进程,所有的监控数据都会统一汇总给server zabbix_agentd:客户端守护进程,负责执行server命令,收集客户端各种参数,如cpu负载,内存,硬盘io等 zabbix_get:zabbix的一个工具,通常用于从ser

Linux中的网络监控命令

监控整体的带宽使用 nload命令 官网下载地址:http://www.roland-riegel.de/nload/index.html 通过YUM也可以安装 yun -y install nload 参数 说明 -t 设置刷新时间间隔,单位为毫秒,默认500 -i 设置入站的流量图显示比例,默认10240 -o 设置出站的流量图显示比例,默认10240 -u 设置显示传输量时的显示单位,用bit位为单位 b:bit/s k:kBit/s m:MBit/s -U 设置显示传输量时的显示单位,用