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[512];int event_size;int event_pos = 0;struct inotify_event *event;res = read(fd, event_buf, sizeof(event_buf));if(res < (int)sizeof(*event)) {if(errno == EINTR)return 0;printf("could not get event, %s\n", strerror(errno));return -1;}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 0;}int main(int argc, char **argv) {int ret;if (argc != 2) {printf("Usage: %s <dir>\n", argv[0]);return -1;}int mINotifyFd = inotify_init();int result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE);if (result < 0) {printf("inotify_add_watch error\n");return -1;}while (1) {ret = read_process_inotify_fd(mINotifyFd);if (ret) {printf("read_process_inotify_fd error\n");return -1;}}return 0; }
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, 0, 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 < 2) {printf("Usage: ./epoll <fifo1> <fifo2> ...\n");return -1;}int mEpollFd = epoll_create(5); //最多监听5个文件if (mEpollFd < 0) {printf("epoll_create error\n");return -1;}int i;for (i = 1; i < argc; i++) {int fd = open(argv[i], O_RDWR);if (fd < 0) {printf("open %s error\n", argv[i]);return -1;}res = epoll_add_watch(mEpollFd, fd);if (res) {printf("epoll_add_watch error\n");return -1;}}while (1) {int poll_result = epoll_wait(mEpollFd, eventItem, MAXEVENTS, -1);for (i = 0; i < poll_result; i++) {int len = read(eventItem[i].data.fd, buf, MAXLEN);buf[len] = '\0';printf("get data : %s\n", buf);} }return 0;}
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 512static 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, 0, 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 < 0) {printf("open %s error\n", filename);return -1;}file_and_fd[fd] = filename;int res = epoll_add_watch(fd);if (res) {printf("epoll_add_watch error\n");return -1;} }int find_fd(char *name) {int i;for (i = 0; i < MAXFD; i++) {if (strcmp(file_and_fd[i], name) == 0)return i;}return -1; }int read_process_inotify_fd(int fd) {int res;char file_path[20];char event_buf[512];int event_size;int event_pos = 0;struct inotify_event *event;res = read(fd, event_buf, sizeof(event_buf));if(res < (int)sizeof(*event)) {if(errno == EINTR)return 0;printf("could not get event, %s\n", strerror(errno));return -1;}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 0;}int main(int argc, char **argv) {int ret;int i;if (argc != 2) {printf("Usage: %s <dir>\n", argv[0]);return -1;}char buf[MAXLEN];int mINotifyFd = inotify_init();int result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE);if (result < 0) {printf("inotify_add_watch error\n");return -1;}DIR_NAME = argv[1];mEpollFd = epoll_create(5); if (mEpollFd < 0) {printf("epoll_create error\n");return -1;}epoll_add_watch(mINotifyFd); //监测目录while (1) {int poll_result = epoll_wait(mEpollFd, eventItem, MAXEVENTS, -1);for (i = 0; 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 -1;}}else{ //文件的内容有变化int len = read(eventItem[i].data.fd, buf, MAXLEN);buf[len] = '\0';printf("get data : %s\n", buf);}}}return 0; }
转载于:https://www.cnblogs.com/zhu-g5may/p/10551055.html
inotify和epoll相关推荐
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- Go 语言简介(下)— 特性
希望你看到这篇文章的时候还是在公交车和地铁上正在上下班的时间,我希望我的这篇文章可以让你利用这段时间了解一门语言.当然,希望你不会因为看我的文章而错过站.呵呵. 如果你还不了解Go语言的语法,还请你移 ...
- Android 系统(57)---深入理解Android输入系统
<深入理解Android 卷III>第五章 深入理解Android输入系统 <深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Fra ...
- Android卡顿掉帧问题分析之原理篇
当用户抱怨手机在使用过程中存在卡顿问题的时候,会严重影响用户对手机品牌的好感和应用APP的体验,从而导致用户对手机品牌的忠诚度降低或应用APP的装机留存率下降.所以无论是手机设备厂商还是应用APP开发 ...
- 安卓IMS 原理解析(二、IMS之InputReader事件获取)
目录 1.EventHub->getEvents() 2.processEventsLocked() 3.mQueuedListener->flush() 前面讲到,在start()后会启 ...
- 从根源上看屏幕点击事件是如何传递到View中的(上)-事件获取
浅谈 曾经在开发的很长一段时间内,笔者对点击事件的认知只存在于自定义View中的onTouchEvent等方法的处理. 后来慢慢的接触到Android的事件分发机制,但也只是在Activity-> ...
- 专题总纲目录 Android Framework 总纲
专题总纲说明: 本系列文章虽说是 Android 的知识体系专题,同时也是学习Android Framework 系统的一个思路,尤其是当我们对Android 框架层 一点都不了解的时候,但前提是要有 ...
- EventHub代码原理详解
一.EventHub简述 Android系统基于Linux系统,由多个子系统组合而成,各子系统分工合作,在各自功能域中扮演关键角色.其中一个比较重要的子系统是Input子系统,正如其名地,挂载于And ...
- RK3128之Settings定制红外遥控开关功能
前言 在日常Android系统开发中,有些客户要求在Settings设置界面添加红外遥控开关功能,比如开关开启,遥控有作用,开关关闭,遥控就没作用.要实现这个功能我们就要去找输入事件了,通过找到按下遥 ...
最新文章
- Google设想将《黑镜》情节变为现实,但要你的隐私作交换
- 编码最佳实践——Liskov替换原则
- SQL语句执行顺序以及oracle基本查询优化
- 当你不知道今天星期几,不妨在编辑器写下这段代码
- Linux工作笔记-使用find和grep检索文件或子文件中是否包含指定字符串
- DevExpress控件介绍
- win7下MongoDB集群告别裸奔
- revit2016注册表删除_Revit怎么卸载,如何把revit彻底卸载删除干净重新安装的方法?【转载】...
- 新系统申请软件著作权详细操作说明
- android文件恢复功能,终于找到了安卓手机删除的文件的恢复方法值得一看
- graphpad做单因素方差分析_如何使用Graphpad做单因素方差分析
- 京东智能客服言犀启发式问答技术探秘
- 平头哥CH2601开发环境(CDK)搭建
- 给wordpess博客的数据库减肥提速
- 如何优化在搜索引擎上的友好度
- Mac加显示器桌面排列设置
- 大数据告诉你,从洛阳北大青鸟毕业的学生未来发展到底怎么样?
- 2015年 android 白皮书
- -bash: mysql: command not found 解决办法
- iOS开发——播放系统音效、自定义音效
热门文章
- Python 入门到精通(—)初识Python
- pycharmlinux报错java,Linux安装PyCharm时提示cannot start PyCharm错误怎么办?
- 综述 | Google团队发布,一文概览Transformer模型的17大高效变种
- 收藏 | 从SGD到NadaMax,深度学习十种优化算法原理及实现
- 卡卡半智能扫地机器人_扫地机器人哪个牌子好?精选五款高智能的扫地机器人...
- python复习-正则表达式
- 关于深度学习框架Hamaa与Python API文档生成工具Sophon
- 数据结构(六)霍夫曼树与编码
- 叠置分析(涉及结果属性和输入图层属性的关系)
- php checkstyle,php codebrowser未正确遵循checkstyle.xml中的路径