参考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. incast.tcl

    # Basic Incast Simulation # Check Args if {$argc != 5} { puts "Usage: ns incast <srv_num> ...

  2. docker commit 显示“invalid reference format”

    docker commit的时候一直显示invalid reference format,改了几次也不行,后来发现是因为docker镜像的名字中不能包含大写字母,改成小写后就行了

  3. Windows软件静默安装

    Install Software in A Slient Way 一般来说,不同的软件的封装类型都有固定的静默安装命令. 查看软件的封装类型 双击setup.exe,在弹出窗口的左上角单击,选择&qu ...

  4. ROS Create a Catkin Workspace

    Step1 : First, create the top level catkin workspace directory and a sub-directory named src (pronou ...

  5. (转)tcp的半连接与完全连接队列

    队列及参数   tcp-sync-queue-and-accept-queue-small.jpg server端的半连接队列(syn队列) 在三次握手协议中,服务器维护一个半连接队列,该队列为每个客 ...

  6. 问题解决:java.sql.SQLException:Value '0000-00-00' can not be represented as java.sql.Date

    问题描述: 数据表中有记录的time字段(属性为timestamp)其值为:“0000-00-00 00:00:00” 程序使用select 语句从中取数据时出现以下异常: Java.sql.SQLE ...

  7. php------中文出现乱码解决方法

    中文出现乱码解决方法:原因编码格式不一致 [1]  建立数据库的时候,字符集选择utf-8  数据库,点表名,点右键,数据库属性…. [2]  修改myspl的配置,在[myspld]模块下面添加ch ...

  8. 显示mac电脑中隐藏的文件和文件夹

    显示mac电脑中隐藏的文件和文件夹的办法:打开电脑,cd到相应的文件夹,输入以下命令,为显示隐藏的文件和文件夹 defaults write com.apple.finder AppleShowAll ...

  9. vue使用element案列

    第一步:使用vue创建项目‘ 第二步:在项目添加element cmd:vue add element demo:https://github.com/weibanggang/vuemode.git

  10. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...