平台信息:
内核: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. .NET中的缓存实现

    软件开发中最常用的模式之一是缓存,这是一个简单但非常有效的概念,想法是重用操作结果,执行繁重的操作时,我们会将结果保存在缓存容器中,下次我们需要该结果时,我们将从缓存容器中取出它,而不是再次执行繁重的 ...

  2. 【7.1.1】ELK日志系统单体搭建

    ELK是什么? 一般来说,为了提高服务可用性,服务器需要部署多个实例,每个实例都是负载均衡转发的后的,如果还用老办法登录服务器去tail -f xxx.log,有很大可能错误日志未出现在当前服务器中, ...

  3. 404 Not Found 由来

    404 NOT FOUND! 抱歉,沒有找到您需要的文章!! 什么是 404 Not Found 404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任.404页面通常为用户访问了网站上不 ...

  4. LaTeX模板

    学校linux机子根本跑不动libreoffice,wps没有公式,只好上LaTeX了. 先 beamer: 需要安装firasans和firamono字体,思源黑体SC \documentclass ...

  5. [luoguP2622] 关灯问题II(状压最短路)

    传送门 本以为是状压DP,但是有后效性. 所以写一手状压spfa #include <queue> #include <cstdio> #include <cstring ...

  6. 将登录等信息保存到session中和退出session

    JShop简介:jshop是一套使用Java语言开发的B2C网店系统,致力于为个人和中小企业提供免费.好用的网店系统. 项目主页:http://git.oschina.net/dinguangx/js ...

  7. [NOIP2002] 普及组

    产生数 预处理出一个数能变成多少种数,然后遍历原串的每一位,累乘方案数即可. 需要用到高精度. /*By SilverN*/ #include<iostream> #include< ...

  8. (转)详解shell中>/dev/null 2>&1到底是什么

    转 原文地址:https://blog.csdn.net/zouli415/article/details/80651526 前言 相信大家经常能在shell脚本中发现>/dev/null 2& ...

  9. 在线修改MySQL大表的表结构

    由于某个临时需求,需要给在线MySQL的某个超过千万的表增加一个字段.此表在设计之时完全按照需求实现,并没有多余的保留字段. 我们知道在MySQL中如果要执行ALTER TABLE操作,MySQL会通 ...

  10. Lca 之倍增算法

    引入: 比如说要找树上任意两个点的路上的最大值.如果是一般的做法 会 接近o(n)的搜,从一个点搜到另一个点,但是如果询问多了复杂度就很高了. 然后我们会预处理.预处理是o(n²)的,询问是o(1)的 ...