平台信息:
内核: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机制【学习笔记】【原创】的更多相关文章

  1. JUC.Lock(锁机制)学习笔记[附详细源码解析]

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  2. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  3. 浏览器中js执行机制学习笔记

    浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...

  4. .NET GC机制学习笔记

    学习笔记内容来自网络资料摘录http://www.cnblogs.com/springyangwc/archive/2011/06/13/2080149.html 1.GC介绍 Garbage Col ...

  5. Java 基础 类加载器和双亲委派机制 学习笔记

    转自博客:https://blog.csdn.net/weixin_38118016/article/details/79579657 文章不是我写的,但是感觉写的挺通俗易懂的,然后防止以后丢失,就转 ...

  6. Linux内核Inotify机制学习笔记

    一.Inotify简介: Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入.它是一个内核用于通知用户空间程序文件系统变化的机制.开源社区提出用户态需要内核提供一些机制,以便用 ...

  7. JavaSPI机制学习笔记

    最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...

  8. Java SPI机制学习笔记

    最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...

  9. Android开发学习之路-回调机制学习笔记

    不知道是我学Java的时候没有认真听还是怎么的,曾经一直不知道什么是“回调”,它有什么用,百度一大堆,都太复杂看不明白(好吧是我笨),所以想把自己理解的分享给其他看到的人,大家都真正认识一下这个重要的 ...

随机推荐

  1. Java学习笔记(1)-(GridBagLayout)网格袋布局

    学习JAVA-布局管理的时候,在书上看到了这么一段话:GridBagLayout的功能非常强大,使用是也比较复杂,考虑到一般的读者很少会使用到这种管理,这里不做介绍.然书本就跳过了,为什么功能强大却很 ...

  2. php file_get_contents json_decode 输出为NULL

    解决办法一:不小心在返回的json字符串中返回了BOM头的不可见字符,某些编辑器默认会加上BOM头,如下处理才能正确解析json数据: $info = json_decode(trim($info,c ...

  3. NOIP2014D2T2寻找道路(Spfa)

    洛谷传送门 这道题可以把边都反着存一遍,从终点开始深搜,然后把到不了的点 和它们所指向的点都去掉. 最后在剩余的点里跑一遍spfa就可以了. ——代码 #include <cstdio> ...

  4. POJ 1017 Packet

    http://poj.org/problem?id=1017 有1*1 2*2...6*6的物品 要装在 6*6的parcel中 问最少用多少个parcel 一直没有找到贪心的策略 问题应该出现在 总 ...

  5. 【BZOJ2560】串珠子(状压DP,容斥原理)

    题意: 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体.现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在 ...

  6. POJ3177,/3352.求最少添加多少边使无向图边双连通

    俩个题一样.tarjan算法应用,开始求桥,WA,同一个边双连通分量中low值未必都相同,不能用此来缩点.后来用并查集来判断,若不是桥,则在一个双连通分量中,并之,后边再查,将同一个双连通分量中的点通 ...

  7. 从零开始写STL-二叉搜索树

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...

  8. Linux下异常信号

    我们介绍一些标准信号的名称以及它们代表的事件.每一个信号名称是一个代表正整数的宏,但是你不要试图去推测宏代表的具体数值,而是直接使用名称.这是因为这个数值会随不同的系统或同样系统的不同版本而不同,但是 ...

  9. Docker+Drone做Java/Tomcat的CI服务

    1. 安装Docker(略过) 2. 编写docker-compose.yaml version: '2' services: drone-server: image: drone/drone:0.8 ...

  10. OSChinaclient源代码学习(3)--轮询机制的实现

    主要以OSChina Androidclient源代码中Notice的轮询机制进行解读. 一.基础知识 一般IM(即使通讯)的实现有两种方式:推送和轮询,推送就是server主动向client发送消息 ...