平台信息:
内核: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. redis异常信息:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.。。。。

    redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but it is current ...

  2. #region 私有字段

    #region 私有字段                   private string _读者类别;          private string _读者类别名称;          priva ...

  3. HTML+CSS 制作HTML5标志图

    效果图如下:(是用代码写的,而不是图片!) 网上看到的代码. 看了下,就是CSS的transform属性的应用.加上定位等.组合在一起形成图片. 没什么难点,就是width,left等数据得根据HTM ...

  4. spring boot学习02【如何在spring boot项目中访问jsp】

    1.配置application.properties文件 打开application.properties追加 spring.mvc.view.prefix=/WEB-ROOT/ spring.mvc ...

  5. Python内置函数—bytearray

    英文文档: class bytearray([source[, encoding[, errors]]]) Return a new array of bytes. The bytearray cla ...

  6. 【状压DP】OpenJ_POJ - C17K Lying Island

    https://vjudge.net/contest/171652#problem/K [题意] 小岛上有n个人,有些是好人(一定是真话),有些是坏人(可能是真话也可能是假话),现在要判断最多有多少好 ...

  7. 【贪心】HDU 最少拦截系统

    https://vjudge.net/contest/68966#problem/I [题解] http://www.cnblogs.com/kuangbin/archive/2012/08/03/2 ...

  8. msp430项目编程

    msp430中项目---LED数码管显示 1.数码管介绍 2.代码(直接使用引脚驱动) 3.代码(使用译码器驱动) 4.项目总结 msp430项目编程 msp430入门学习

  9. 《APP开发》APP规范实例-详细的UI设计方法

    对了一个APP开发初手来说,可能心里有很多的疑惑: 屏幕设计为多宽,宽度是不是应该设置为百分比; 按钮大小多大,怎么排列,文字字体用多大的?什么字体显示好看?图标多大,怎么用色?界面怎么布局?等等很多 ...

  10. 【搜索引擎】Solr最新安装以及通过关系型数据库(MySQL,Oracle,PostgreSQL)导入数据

    版本号 最新的solr版本 : Solr 8.1.1下载地址:https://lucene.apache.org/solr/downloads.html solr-8.1.0.tgz for Linu ...