参考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的更多相关文章

  1. 安卓输入子系统之inotify与epoll机制【学习笔记】【原创】

    平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在安卓的输入子系统中如何监听文件的产生 ...

  2. 输入系统:epoll & inotify

    一.epoll 作用:检测一个或多个文件的可读.可写等属性变化: 代码示例: #include <sys/epoll.h> #include <stdio.h> #includ ...

  3. Android系统--输入系统(一)必备的Linux知识_inotify和epoll

    Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...

  4. 10.1、android输入系统_必备Linux编程知识_inotify和epoll

    1. inotify和epoll 怎么监测键盘接入与拔出? (1)hotplug机制:内核发现键盘接入/拔出==>启动hotplug进程==>发消息给输入系统 (2)inotify机制:输 ...

  5. GO 语言简介(网摘)

    GO 语言简介 原文出处:[陈皓 coolshell] Hello World 文件名 HELLO.GO package main //声明本文件的package名 import "fmt& ...

  6. Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  7. Android 工具视频学习笔记_WDS

    1. 由于Android源码过于庞大,SourceInsight会经常卡死,不适合了.适合的是Android Studio, 非常好用.使用手册上有介绍如何安装. 编译安卓的过程说明手册中也有. 3. ...

  8. Go 语言简介(下)— 特性

    希望你看到这篇文章的时候还是在公交车和地铁上正在上下班的时间,我希望我的这篇文章可以让你利用这段时间了解一门语言.当然,希望你不会因为看我的文章而错过站.呵呵. 如果你还不了解Go语言的语法,还请你移 ...

  9. 《深入理解Android 卷III》第五章 深入理解Android输入系统

    <深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分. ...

随机推荐

  1. tempdb过大事故记录-sqlserver

    今天收到预警消息,提示磁盘空间已经满了,感觉很奇怪.刚装的新机器怎么可能会磁盘空间不足.登陆看了看 可以看的到tempdb已经65G的了,而且显示是百分百可用.这个就很奇怪了,为什么会出现这种情况呢. ...

  2. C#常用排序和查找算法

    1.C#堆排序代码 private static void Adjust (int[] list, int i, int m) { int Temp = list[i]; int j = i * 2 ...

  3. Python学习---同步条件event/队列queue1223

    写在前面: 在使用这些共享API的时候,我们要注意以下几点: 在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie).所以,有必要对每个Proce ...

  4. MARKS:路由器桥接

    仅供参考…… 测试使用环境:Tplink & Tenda渣渣路由器.其他环境或不同. 设置注意事项:副路由器网段设置和主路由一致.主路由不需要开启WDS.副路由器开启WDS(连接ok,状态即显 ...

  5. 使用Jmeter进行接口测试和压力测试的配置和使用

    1. Jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. JMeter 可 ...

  6. February 10 2017 Week 6 Friday

    Example is always more efficacious than precept. 身教胜于言教. Always match your words with your actions. ...

  7. API 网关

    使用 API 网关   链接:https://github.com/oopsguy/microservices-from-design-to-deployment-chinese译者:Oopsguy ...

  8. [原]如何在Android用FFmpeg+SDL2.0之同步视频

    关于视频同步的原理可以参考http://dranger.com/ffmpeg/tutorial05.html 和 [原]基础学习视频解码之同步视频 这两篇文章,本文是在这两篇的基础上移植到了Andro ...

  9. Windows环境双系统安装环境配置

    (最惊喜的事情莫过于...在安装系统完成重新试图安装Docker时解决了关于HyperV的问题,结果提示Docker只能在Win10 Pro或者Enterprise环境下运行...我很坚强...可以按 ...

  10. PhoneGap API 之多媒体

    一. MediaApi 简单介绍 PhoneGap API Media 对象提供录制和回放设备上的音频文件的能力 参数: var media = new Media(src, mediaSuccess ...