基于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 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生 ...
随机推荐
- Eclipse中高效的快捷键、调试及Junit
Eclipse中高效的快捷键 当我知道了这些快捷键的用法之后,感觉真的非常兴奋,没想到Eclipse中还有这么多令人惊喜的功能,真的能够提高效率. 内容提示 Alt+/ 用于输入标准库或者keywor ...
- 【前端福利】用grunt搭建自己主动化的web前端开发环境-完整教程
jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发者.假设你如今还不知道grunt或者听说过. ...
- mysqli数据库操作简单实例
mysqli数据库操作简单实例 代码 结果
- angular4父组件向子组件传值,子组件向父组件传值的方法
父组件向子组件传值 @Input 文件目录 父组件: father.template.html <h1>父组件</h1> <cmt-child [data]='dat ...
- 微信小程序发送模板消息
微信小程序发送模板消息 标签(空格分隔): php 看小程序文档 [模板消息文档总览]:https://developers.weixin.qq.com/miniprogram/dev/framewo ...
- python之--初始面向对象
阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 类命名空间与对象.实例的命名空间 类的组合用法 初识面向对象小结 面向对象的三大特性 继承 多态 封装 ...
- java代码实现python2中aes加密经历
背景: 因项目需要,需要将一个python2编写的aes加密方式改为java实现. 1.源python2实现 from Crypto.Cipher import AES from binascii i ...
- Android中onActivityResult()获取返回值
需求:从FirstActivity跳到SecondActivity,在SecondActivity中进行了操作并返回到FirstActivity. FirstActivity中的主要代码: priva ...
- LeetCode(15)3Sum
题目如下: Python代码: def threeSum(self, nums): res = [] nums.sort() for i in xrange(len(nums)-2): if i &g ...
- Hive 基本操作
1.创建一个表 (字段表名不加引号‘,分隔符需要加引号) create table t1( id int ,name string ,hobby array<string> ,add ma ...