基于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 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生 ...
随机推荐
- myeclipse打开jsp页面慢或者卡死
不知道你们有没有这种经历,反正无论是公司电脑还是自己电脑,myeclipse打开jsp页面卡的不行不行的,又是甚至会出现卡死的现象,几经周折,找到了解决办法,亲测有效 打开window-prefere ...
- MS SQL 获取数据字典的经典sql语句
select [表名]=c.Name, [表说明]=isnull(f.[value],''), [列名]=a.Name, [列序号]=a.Column_id, [标识]=case when is_id ...
- Sybase to Oracle Golden Gate
Sybase 安装Golden Gate: 下载,然后create subdirs.并且在两端配置好mgr,设置好端口7809 创建golden gate用户ogguser,并且给它授权sa和repl ...
- Custom Hosting in IIS/WAS
常常需要与宿主实例进行交互.这对于使用自托管的方式是不可或缺的.当使用IIS或WAS时,不能直接访问宿主.为了克服这个障碍,WCF提供了一个宿主工厂.在.svc文件中使用Factory标签,使用此工厂 ...
- Guitar Pro中文版下载,你想要的,都在这啦!
我的音乐我做主!Guitar Pro7中文版的发布为更多音乐爱好者带来更多更优质的体验!为帮助所有吉他爱好者学习.绘谱.创作而设计的音乐空间!为前所未有的音乐盛听而震撼,音乐才子,等的就是你! Gui ...
- LeetCode Golang 7. 整数反转
7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. Tips : Math包给出的类型大小的边界: // Integer limit values. const ...
- XML教程!
什么是XML? XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML.它被设计的宗旨是传输数据,而非显示数据.XML标签没有被预定义,需要 ...
- Eclipse中使用GIT将文件还原至上一版本
GIT将文件还原至上一版本: 选中文件——右击——Replace With——HEAD Revision:
- SQLserver 导入超大CSV(100G以上)方法
1.似乎SQLSERVER2008对UTF8不兼容,采用SQLSERVER20052.采用SQLSERVER2005,还是出现UTF8诸如此类的问题,修改表结构,varchar改成 nvarchar3 ...
- HDU 3068 最长回文( Manacher模板题 )
链接:传送门 思路:Manacher模板题,寻找串中的最长回文子串 /***************************************************************** ...