inotify和epoll
参考EventHub.cpp
1、初始化inotify
int mINotifyFd = inotify_init();
2、将要监测的目录添加到inotify
int result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE);
3、读inotify有没有event
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <stdio.h> int read_process_inotify_fd(int fd)
{
int res;
char event_buf[];
int event_size;
int event_pos = ;
struct inotify_event *event;
res = read(fd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return ;
printf("could not get event, %s\n", strerror(errno));
return -;
}
while(res >= (int)sizeof(*event)) {
event = (struct inotify_event *)(event_buf + event_pos);
//printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");
if(event->len) { if(event->mask & IN_CREATE) {
printf("create file: %s\n", event->name);
} else {
printf("delete file: %s\n", event->name);
}
}
event_size = sizeof(*event) + event->len;
res -= event_size;
event_pos += event_size;
}
return ; } int main(int argc, char **argv)
{
int ret;
if (argc != ) {
printf("Usage: %s <dir>\n", argv[]);
return -;
} int mINotifyFd = inotify_init();
int result = inotify_add_watch(mINotifyFd, argv[], IN_DELETE | IN_CREATE);
if (result < ) {
printf("inotify_add_watch error\n");
return -;
}
while () {
ret = read_process_inotify_fd(mINotifyFd);
if (ret) {
printf("read_process_inotify_fd error\n");
return -;
}
} return ;
}
1、创建epoll
int mEpollFd = epoll_create(5);
2、打开fifo路径,添加到epoll
3、epoll_wait
4、读数据
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <unistd.h> /*
*
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t; struct epoll_event {
uint32_t events; /* Epoll events */
/* epoll_data_t data; /* User data variable */
/* };
*/ #define MAXEVENTS 10
#define MAXLEN 512
static struct epoll_event eventItem[MAXEVENTS]; int epoll_add_watch(int mEpollFd, int fd)
{
struct epoll_event eventItem;
memset(&eventItem, , sizeof(eventItem));
eventItem.events = EPOLLIN;
eventItem.data.fd = fd;
int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem);
return result;
} int main(int argc, char **argv)
{
int res;
char buf[MAXLEN];
if (argc < ) {
printf("Usage: ./epoll <fifo1> <fifo2> ...\n");
return -;
}
int mEpollFd = epoll_create(); //最多监听5个文件
if (mEpollFd < ) {
printf("epoll_create error\n");
return -;
} int i;
for (i = ; i < argc; i++) {
int fd = open(argv[i], O_RDWR);
if (fd < ) {
printf("open %s error\n", argv[i]);
return -;
}
res = epoll_add_watch(mEpollFd, fd);
if (res) {
printf("epoll_add_watch error\n");
return -;
}
} while () {
int poll_result = epoll_wait(mEpollFd, eventItem, MAXEVENTS, -);
for (i = ; i < poll_result; i++) {
int len = read(eventItem[i].data.fd, buf, MAXLEN);
buf[len] = '\0';
printf("get data : %s\n", buf);
}
}
return ; }
inotify和epoll同时使用,即能监测到有没有新的文件创建,还能读出文件内容
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/epoll.h> static int mEpollFd;
#define MAXEVENTS 10
#define MAXLEN 512
#define MAXFD 512 static char *DIR_NAME;
static struct epoll_event eventItem[MAXEVENTS]; char *file_and_fd[MAXFD]; int epoll_add_watch(int fd)
{
struct epoll_event eventItem;
memset(&eventItem, , sizeof(eventItem));
eventItem.events = EPOLLIN;
eventItem.data.fd = fd;
int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem);
return result;
} void epoll_rm_watch(int fd)
{
epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, NULL); } //打开文件并加入epoll监听
int open_file_add_epoll(char *filename)
{
int fd = open(filename, O_RDWR);
if (fd < ) {
printf("open %s error\n", filename);
return -;
}
file_and_fd[fd] = filename;
int res = epoll_add_watch(fd);
if (res) {
printf("epoll_add_watch error\n");
return -;
}
} int find_fd(char *name)
{
int i;
for (i = ; i < MAXFD; i++) {
if (strcmp(file_and_fd[i], name) == )
return i;
}
return -;
} int read_process_inotify_fd(int fd)
{
int res;
char file_path[];
char event_buf[];
int event_size;
int event_pos = ;
struct inotify_event *event;
res = read(fd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
return ;
printf("could not get event, %s\n", strerror(errno));
return -;
}
while(res >= (int)sizeof(*event)) {
event = (struct inotify_event *)(event_buf + event_pos);
//printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");
if(event->len) {
sprintf(file_path, "%s/%s", DIR_NAME, event->name);
if(event->mask & IN_CREATE) {
printf("create file: %s\n", event->name);
open_file_add_epoll(file_path);
} else {
printf("delete file: %s\n", event->name);
int file_fd = find_fd(file_path);
epoll_rm_watch(file_fd);
}
}
event_size = sizeof(*event) + event->len;
res -= event_size;
event_pos += event_size;
}
return ; } int main(int argc, char **argv)
{
int ret;
int i;
if (argc != ) {
printf("Usage: %s <dir>\n", argv[]);
return -;
} char buf[MAXLEN]; int mINotifyFd = inotify_init();
int result = inotify_add_watch(mINotifyFd, argv[], IN_DELETE | IN_CREATE);
if (result < ) {
printf("inotify_add_watch error\n");
return -;
}
DIR_NAME = argv[];
mEpollFd = epoll_create();
if (mEpollFd < ) {
printf("epoll_create error\n");
return -;
} epoll_add_watch(mINotifyFd); //监测目录 while () { int poll_result = epoll_wait(mEpollFd, eventItem, MAXEVENTS, -); for (i = ; i < poll_result; i++) {
if (eventItem[i].data.fd == mINotifyFd) { //有新文件创建, 目录argv[1]里面有变化
ret = read_process_inotify_fd(mINotifyFd);
if (ret) {
printf("read_process_inotify_fd error\n");
return -;
}
}else{ //文件的内容有变化
int len = read(eventItem[i].data.fd, buf, MAXLEN);
buf[len] = '\0';
printf("get data : %s\n", buf);
} }
} return ;
}
inotify和epoll的更多相关文章
- 安卓输入子系统之inotify与epoll机制【学习笔记】【原创】
平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在安卓的输入子系统中如何监听文件的产生 ...
- 输入系统:epoll & inotify
一.epoll 作用:检测一个或多个文件的可读.可写等属性变化: 代码示例: #include <sys/epoll.h> #include <stdio.h> #includ ...
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- 10.1、android输入系统_必备Linux编程知识_inotify和epoll
1. inotify和epoll 怎么监测键盘接入与拔出? (1)hotplug机制:内核发现键盘接入/拔出==>启动hotplug进程==>发消息给输入系统 (2)inotify机制:输 ...
- GO 语言简介(网摘)
GO 语言简介 原文出处:[陈皓 coolshell] Hello World 文件名 HELLO.GO package main //声明本文件的package名 import "fmt& ...
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android 工具视频学习笔记_WDS
1. 由于Android源码过于庞大,SourceInsight会经常卡死,不适合了.适合的是Android Studio, 非常好用.使用手册上有介绍如何安装. 编译安卓的过程说明手册中也有. 3. ...
- Go 语言简介(下)— 特性
希望你看到这篇文章的时候还是在公交车和地铁上正在上下班的时间,我希望我的这篇文章可以让你利用这段时间了解一门语言.当然,希望你不会因为看我的文章而错过站.呵呵. 如果你还不了解Go语言的语法,还请你移 ...
- 《深入理解Android 卷III》第五章 深入理解Android输入系统
<深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分. ...
随机推荐
- Oracle数据库从入门到精通 多表查询知识以及范例
视频课程:李兴华 Oracle从入门到精通视频课程 学习者:阳光罗诺 视频来源:51CTO学院 总体内容: 多表查询的意义以及基本问题. 表的连接查询 SQL:1999语法标准对多表查询的支持. 数据 ...
- windows下安装jmeter
windows下安装jmeter post by rocdk890 / 2012-8-19 16:08 Sunday windows技术 发表评论 JMeter是Apache软件基金会的产品,用于对静 ...
- js 浅拷贝有大用
如题 像浅拷贝.深拷贝这类的知识点我们应该都明白是怎么回事,大部分都是在面试的时候会被问到.大多让你实现一个深拷贝.现实中我们都用比较暴力直接的手段 JSON stringify. 一句话就搞定,管他 ...
- 404错误 标签: servlet浏览器 2016-11-16 16:58 61人阅读 评论(0) 收藏
404是资源没有找到,一般由于以下几个方面导致: 1.路径出错: a)检查web.xml中servlet的配置是否出错 b)浏览器访问是路径书写方式:http://localhost:8080/项目名 ...
- Spring学习总结之---装配Bean
Spring配置的可选方案 前言:Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,作为开发人员,你需要告诉Spring容器要创建那些Bean,以哪种方式创建,并且如何将 ...
- January 21 2017 Week 3 Saturday
Courage is grace under pressure. 勇气就是压力下的优雅. In the face of stress, can you deal with your task smoo ...
- 鉴定JavaScript中的数据类型
众所周知,JavaScript是一门弱类型的语言,但是这并不代表JavaScript中没有数据类型.JavaScript中常见的数据类型有string.number.object等等,通常我们使用ty ...
- [objc explain]: Non-fragile ivars
[objc explain]: Non-fragile ivars (2009-01-27 09:30 PM) Non-fragile instance variables are a hea ...
- UVa 10384 - The Wall Pushers
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- HDU 1166 【线段树 || 树状数组,单点修改 维护区间和】
题目链接 HDU 1166 大概题意: 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工 ...