安卓输入子系统之inotify与epoll机制【学习笔记】【原创】
平台信息:
内核:linux3.1.0
系统:android5.0
平台:tiny4412
作者:庄泽彬(欢迎转载,请注明作者)
说明: 韦老师的安卓视频学习笔记
一、在安卓的输入子系统中如何监听文件的产生以及监听文件是否有数据的输入,文件的监听主要使用的是inotify机制来监听文件的创建以及删除。使用epoll可以用来监听文件是否有数据的变化。下面针对这两种机制分别编程,简单的了解以及如何使用.
二、使用inotify监听文件的创建以及删除.
2.1我们先来看看现象之后在来看看具体的代码是如何实现的把。
在后台运行的inotify可以检测到文件的创建以及删除。
2.2代码的实现
#include <unistd.h>
#include <stdio.h>
#include <sys/inotify.h>
#include <string.h>
#include <errno.h> int read_process_inotify_fd(int fd)
{
char event_buf[];
int event_size;
int event_pos = ;
int res;
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) {
//openDeviceLocked(devname);
printf("Create file: %s\r\n",event->name);
} else {
//closeDeviceByPathLocked(devname);
printf("delete file: %s\r\n",event->name);
}
}
event_size = sizeof(*event) + event->len;
res -= event_size;
event_pos += event_size;
} return ; } int main(int argc,char **argv)
{
int mINotifyFd;
int result; if (argc != ){
printf("Usage: %s <dir> \r\n",argv[]);
return -;
} mINotifyFd = inotify_init();
if (mINotifyFd <= ){
printf("Error inotify_init\r\n");
return -;
} result = inotify_add_watch(mINotifyFd, argv[], IN_DELETE | IN_CREATE); while(){
read_process_inotify_fd(mINotifyFd);
} return ;
}
编译命令:gcc -o inotify inotify.c,之后按照2.1截图的步骤运行即可。
三、使用epoll来监听文件是否有数据的写入.
3.1代码的具体实现如下:
#include <sys/epoll.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h> static const int EPOLL_SIZE_HINT = ;
static const int EPOLL_MAX_EVENTS = ; #define DATA_MAX_LEN 512 int add_to_epoll(int fd,int epollfd)
{
int result;
struct epoll_event eventItem; memset(&eventItem, , sizeof(eventItem));
eventItem.events = EPOLLIN;
eventItem.data.fd = fd;
result = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &eventItem); return result;
} void rm_from_epoll(int fd,int epollfd)
{
epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL);
} int main(int argc,char **argv)
{
int mEpollFd;
int tmp_fd;
int pollResult;
int i;
int len;
char buf[DATA_MAX_LEN]; struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS]; if(argc < ){
printf("Usage: %s <file1> [file2] [file3]\r\n",argv[]);
return -;
} mEpollFd = epoll_create(EPOLL_SIZE_HINT);
if (mEpollFd < ){
printf("Error epoll_create\r\n");
return -;
} for(i = ;i < argc;i ++){
tmp_fd = open(argv[i],O_RDWR);
add_to_epoll(tmp_fd,mEpollFd);
} while(){
pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, -); for(i = ;i < pollResult;i ++){
printf("Reason: 0x%x\r\n",mPendingEventItems[i].events);
len = read(mPendingEventItems[i].data.fd,buf,DATA_MAX_LEN);
buf[len] = '\0';
printf("get data:%s\r\n",buf);
}
sleep();
} return ;
}
编译文件:gcc -o epoll epoll.c
3.2实验的结果如下:可实现对文件数据输入监听.
安卓输入子系统之inotify与epoll机制【学习笔记】【原创】的更多相关文章
- JUC.Lock(锁机制)学习笔记[附详细源码解析]
锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- 浏览器中js执行机制学习笔记
浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...
- .NET GC机制学习笔记
学习笔记内容来自网络资料摘录http://www.cnblogs.com/springyangwc/archive/2011/06/13/2080149.html 1.GC介绍 Garbage Col ...
- Java 基础 类加载器和双亲委派机制 学习笔记
转自博客:https://blog.csdn.net/weixin_38118016/article/details/79579657 文章不是我写的,但是感觉写的挺通俗易懂的,然后防止以后丢失,就转 ...
- Linux内核Inotify机制学习笔记
一.Inotify简介: Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入.它是一个内核用于通知用户空间程序文件系统变化的机制.开源社区提出用户态需要内核提供一些机制,以便用 ...
- JavaSPI机制学习笔记
最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...
- Java SPI机制学习笔记
最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...
- Android开发学习之路-回调机制学习笔记
不知道是我学Java的时候没有认真听还是怎么的,曾经一直不知道什么是“回调”,它有什么用,百度一大堆,都太复杂看不明白(好吧是我笨),所以想把自己理解的分享给其他看到的人,大家都真正认识一下这个重要的 ...
随机推荐
- hadoop上传文件报错
19/06/06 16:09:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad ...
- java中String数组和List的互相转化
1.List转String数组 方法一: //先准备一个List List<String> testList=new ArrayList<>(); testList.add(& ...
- python selenium xpath定位方式
作者刚开始写博客,格式和语言方面难免存在问题,请大家海涵,如果有问题也请直接指出 xpath是一种在xm文档中定位的语言,详细简介,请自行参照百度百科,本文主要总结一下xpath的使用方法,个人看法, ...
- Codeforces Round #211 (Div. 2)-D. Renting Bikes,二分!感谢队友出思路!
D. Renting Bikes 读懂题后一开始和队友都以为是贪心.可是贪心又怎么贪呢..我们无法确定到底能买多少车但肯定是最便宜的前x辆.除了公共预算每个人的钱只能自己用,也无法确定每个人买哪一辆车 ...
- js命名
JS变量名前加 _ 与 $ 的区别: 下划线一般当做私有属性, 业界会比较常用$开头作为框架.库的关键词前缀,目的是避免命名冲突
- HDU 6396 贪心+优先队列+读入挂
Swordsman Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- [Bzoj1083][SCOI2005]互不侵犯king(状压dp)
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4595 Solved: 2664[Submit][ ...
- Spring Data JPA 入门篇
Spring Data JPA是什么 它是Spring基于ORM框架(如hibernate,Mybatis等).JPA规范(Java Persistence API)封装的一套 JPA应用框架,可使开 ...
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...
- 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)
各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名 ...