基于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.
monitor for the file referred to by that pathname.
the watch is created.
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)).
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:
#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]);
}
} }
这里我仅仅监控了创建和改动的两个事件,然后依据文件名称字和一些其它的相应机制进行对文件推断改动等。
基于redis ae实现 Linux中的文件系统监控机制(inotify)的更多相关文章
- Linux中常用的监控性能的命令(sar、mpstat,vmstat, iostat,)详解
Linux中常用的监控性能的命令有: sar:能查看CPU的平均信息,还能查看指定CPU的信息.与mpstat相比,sar能查看CPU历史信息 mpstat:能查看所有CPU的平均信息,还能查看指定C ...
- inotify 工具 是一种强大的、细粒度的、异步文件系统监控机制
前言:Inotify是一种强大的.细粒度的.异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性.读写属性.权限属性.删除创建.移动等操作,也就是可以监控文件发生的一切变化. ...
- LInux中的文件系统1
2017-03-08 10:37:55 一.虚拟文件系统VFS 文件系统用于将位于磁盘上的文件按照某种方式组织进内存,并给上层应用程序提供统一的访问接口.Linux支持多种文件系统EXT2/3,NTF ...
- Linux 中直接 I/O 机制的介绍
https://www.ibm.com/developerworks/cn/linux/l-cn-directio/ 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作 ...
- I/O 机制的介绍(Linux 中直接 I/O 机制的介绍)
IO连接的建立方式 1.缓存IO.流式IO: 2.映射IO.块式IO: 3.直接IO. IO的方式: 同步.异步.定时刷新: MMAP与内核空间 mmap使用共享用户空间与内核空间实现: 直接 I/O ...
- Linux中文件/文件系统的压缩、打包和备份总结(基于rhel7)
文件/文件系统的压缩.打包 Linux有哪些压缩工具可供选择 按压缩比:xz>bzip2>gzip,按压缩时长:gzip>bzip2>xz,另外还有zip可以选择. gzip只 ...
- 基于redis AE异步网络架构
最近的研究已redis源代码,redis高效率是令人钦佩. 在我们的linux那个机器,cpu型号, Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel(R) ...
- Linux中ext2文件系统的结构
1.ext2产生的历史 最早的Linux内核是从MINIX系统过渡发展而来的.Linux最早的文件系统就是MINIX文件系统.MINIX文件系统几乎到处都是bug,采用的是16bit偏移量,最大容量为 ...
- linux中proc文件系统 -- ldd3读书笔记
1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生 ...
随机推荐
- Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires
Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires ...
- 【BZOJ 2724】 蒲公英
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2724 [算法] 分块算法在线维护区间众数 分块算法的精髓就在于 : 大段维护,局部朴 ...
- Java-MyBatis-3.0:MyBatis 3 简介
ylbtech-Java-MyBatis-3.0:MyBatis 3 简介 1.返回顶部 1. 简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程 ...
- 操作系统-容器-引擎容器-百科:Docker
ylbtech-操作系统-容器-引擎容器-百科:Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上 ...
- js如何计算浮点数
js中浮点型是如何运算的呢? 例如:var a=0.69; 我想得到6.9 直接这样写 var c=a*10; alert(c); 得到结果是:6.8999999999999995 到网上一搜,有 ...
- python程序执行原理
Python程序的执行原理 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后解释器一条一条执行字节码指令,从而完成程序的执行. 1.1python先把代码(.py ...
- QT-自定义信号和槽
前言:信号和槽是一种松耦合机制,或者说是一种分布式机制,信号广播出去,槽会自定义订阅接收. 一.新建工程 二.新建部件 拖入button按钮.修改内容为“发送自定义信号” 三.自定义发送信号 3.1 ...
- 流式计算新贵Kafka Stream设计详解--转
原文地址:https://mp.weixin.qq.com/s?__biz=MzA5NzkxMzg1Nw==&mid=2653162822&idx=1&sn=8c4611436 ...
- Ubuntu 14.04安装Skype
Skype 4.3版本在14.04 LTS工作正常.安装步骤: $ sudo apt-get remove skype skype-bin:i386 skype:i386 $ sudo apt-get ...
- ASP.NET中各种缓存技术的特点及使用场景
对于一些不经常改变却经常被request的数据,我们喜欢将它们缓存在内存.这样用户请求时先到缓存中去取,如果缓存中没有,再去数据库拿,提高响应速度.缓存一般实现在BLL,这样可以与DAL分离,更换数据 ...