安卓输入子系统之inotify与epoll机制【学习笔记】【原创】

平台信息:
内核:linux3.1.0
系统:android5.0
平台:tiny4412

作者:庄泽彬(欢迎转载,请注明作者)

说明: 韦老师的安卓视频学习笔记

一、在安卓的输入子系统中如何监听文件的产生以及监听文件是否有数据的输入,文件的监听主要使用的是inotify机制来监听文件的创建以及删除。使用epoll可以用来监听文件是否有数据的变化。下面针对这两种机制分别编程,简单的了解以及如何使用.

二、使用inotify监听文件的创建以及删除.

2.1我们先来看看现象之后在来看看具体的代码是如何实现的把。

在后台运行的inotify可以检测到文件的创建以及删除。

2.2代码的实现

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <sys/inotify.h>
 4 #include <string.h>
 5 #include <errno.h>
 6
 7
 8 int read_process_inotify_fd(int fd)
 9 {
10     char event_buf[512];
11     int event_size;
12     int event_pos = 0;
13     int res;
14     struct inotify_event *event;
15
16
17     res = read(fd, event_buf, sizeof(event_buf));
18     if(res < (int)sizeof(*event)) {
19         if(errno == EINTR)
20             return 0;
21         printf("could not get event, %s\n", strerror(errno));
22         return -1;
23     }
24
25     while(res >= (int)sizeof(*event)) {
26         event = (struct inotify_event *)(event_buf + event_pos);
27         //printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");
28         if(event->len) {
29             if(event->mask & IN_CREATE) {
30                 //openDeviceLocked(devname);
31                 printf("Create file: %s\r\n",event->name);
32             } else {
33                 //closeDeviceByPathLocked(devname);
34                 printf("delete file: %s\r\n",event->name);
35             }
36         }
37         event_size = sizeof(*event) + event->len;
38         res -= event_size;
39         event_pos += event_size;
40     }
41
42     return 0;
43
44 }
45
46 int main(int argc,char **argv)
47 {
48     int mINotifyFd;
49     int result;
50
51     if (argc != 2){
52         printf("Usage: %s <dir> \r\n",argv[0]);
53         return -1;
54     }
55
56     mINotifyFd = inotify_init();
57     if (mINotifyFd <= 0){
58         printf("Error inotify_init\r\n");
59         return -1;
60     }
61
62
63     result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE);
64
65     while(1){
66         read_process_inotify_fd(mINotifyFd);
67     }
68
69
70
71     return 0;
72 }

编译命令:gcc -o inotify inotify.c,之后按照2.1截图的步骤运行即可。

三、使用epoll来监听文件是否有数据的写入.

3.1代码的具体实现如下:

 1 #include <sys/epoll.h>
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 #include <fcntl.h>
 7 #include <string.h>
 8
 9
10 static const int EPOLL_SIZE_HINT = 8;
11 static const int EPOLL_MAX_EVENTS = 16;
12
13 #define DATA_MAX_LEN 512
14
15
16 int add_to_epoll(int fd,int epollfd)
17 {
18     int result;
19     struct epoll_event eventItem;
20
21     memset(&eventItem, 0, sizeof(eventItem));
22     eventItem.events = EPOLLIN;
23     eventItem.data.fd = fd;
24     result = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &eventItem);
25
26     return result;
27 }
28
29 void rm_from_epoll(int fd,int epollfd)
30 {
31      epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL);
32 }
33
34 int main(int argc,char **argv)
35 {
36     int mEpollFd;
37     int tmp_fd;
38     int pollResult;
39     int i;
40     int len;
41     char buf[DATA_MAX_LEN];
42
43     struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS];
44
45     if(argc < 2){
46         printf("Usage: %s <file1> [file2] [file3]\r\n",argv[0]);
47         return -1;
48     }
49
50
51     mEpollFd = epoll_create(EPOLL_SIZE_HINT);
52     if (mEpollFd < 0){
53         printf("Error epoll_create\r\n");
54         return -1;
55     }
56
57     for(i = 0;i < argc;i ++){
58         tmp_fd = open(argv[i],O_RDWR);
59         add_to_epoll(tmp_fd,mEpollFd);
60     }
61
62     while(1){
63         pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, -1);
64
65         for(i = 0 ;i < pollResult;i ++){
66             printf("Reason: 0x%x\r\n",mPendingEventItems[i].events);
67             len = read(mPendingEventItems[i].data.fd,buf,DATA_MAX_LEN);
68             buf[len] = ‘\0‘;
69             printf("get data:%s\r\n",buf);
70         }
71         sleep(5);
72     }
73
74
75     return 0;
76 }

编译文件:gcc -o epoll epoll.c

3.2实验的结果如下:可实现对文件数据输入监听.

时间: 2024-07-29 21:41:39

安卓输入子系统之inotify与epoll机制【学习笔记】【原创】的相关文章

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

上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了,自己的步伐完全被打乱了~不能继续被动下去,得重新找到自己的节奏. 4.获取类的Constructor 通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例 Class<T>类提供了几个方法获取类的构造器. public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反

C++面向对象—成员函数与成员变量的实现机制学习笔记(1)

<深度搜索C++对象模型>的一些学习纪要: 原文链接:ordeder   http://blog.csdn.net/ordeder/article/details/26396989 一成员变量篇 0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理: 1. 类中,多个代码区块public或者private最终会被按区块统一,然后编译过程中,后定义的成员变量地址高于定义的成员变量: 2. 静态变量在程序启动时初始化,存储的位置在于程序的全局数据段中: 3. 继承

Android Activity和Intent机制学习笔记

Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态). 对于Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onR

Linux音频ALSA机制学习笔记&lt;二&gt;

首先是dapm是什么?就是音频电源动态管理.相信电源管理大家都不会陌生.dapm设计的目的就是只有需要时才打开必要的部件 (widget),不需要时则关闭部件, 达到省电的目的.ALSA通过kcontrol来切换音频通道,当playback或者capture时会更新通道激活下 的widget power,这个是由内核event统一完成的,无须上层干预. <一>widget 定义widget static const struct snd_soc_dapm_widget tabla_dapm_w

JavaSPI机制学习笔记

最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制.具体而言: 1. 定义一组接口, 假设是 autocomplete.PrefixMatcher: 2. 写出接口的一个或多个实现(autocomplete.EffectiveWordMatcher, autocomplete.SimpleWordMatcher): 3.

&lt;&lt;深入Java虚拟机&gt;&gt;-虚拟机类加载机制-学习笔记

类加载的时机 遇到new.getstatic.putstatic或invokestatic这4个字节码指令时,如果类没有进行过初始化,则需要先触发其初始化.生成这4条指令最常见的Java场景是:使用new关键字实例化对象的时候.读取或设置一个类的静态字段(被final修饰.已在编译期把结果放入到常量池的静态变量除外)的时候,以及调用一个类的静态方法的时候. 使用java.lang.reflect包的方法对类进行反射调用时候,如果类没有进行初始化,则需先触发其初始化. 当初始化一个类的时候,发现其

Linux音频ALSA机制学习笔记&lt;一&gt;

首先宏观看内核暴露给上层的接口: [email protected]:/ # cat /dev/snd/ controlC0 pcmC0D10p pcmC0D13c pcmC0D15c pcmC0D2c pcmC0D3c pcmC0D5p pcmC0D8c pcmC0D0c pcmC0D11p pcmC0D13p pcmC0D15p pcmC0D2p pcmC0D3p pcmC0D6c pcmC0D9c pcmC0D0p pcmC0D12c pcmC0D14c pcmC0D1c pcmC0D31

Android知识体系梳理笔记三:动态代理模式---插件加载机制学习笔记

静态代理模式 静态代理模式就是我们常说的代理设计模式,我们采用一个代理类调用原有的方法,且对产生的结果进行控制:举个例子:我们现在在玩一款网络游戏,需要打怪升级:太累就找个代理吧,一觉醒来就会发现我们已经当上CEO,迎娶白富美,天下第一了! 本来我们只能打怪,打怪-,但经过代理类增强,我们不仅可以打怪,还可以升级拿装备.就这样子了! 上代码: * 同一功能接口 public interface PlayNetGame { String beatMonster(); } 1 2 3 4 1 2 3

Java异常机制 学习笔记一

什么是异常? 异常,不正常也.Exception是Exception event的缩写,因此异常是一个事件,该事件发生在程序运行时. 异常会影响程序的连续性,使程序中断. 在Java中,一切皆对象,所以要定义异常,也需要使用对象.异常对象里封装了异常类型和程序发生异常时的状态. 我们经常说的抛出异常就是创建异常对象,并提交给运行系统. 异常捕获机制 当异常发生时,我们需要知道异常在哪里发生的,那么怎么定位异常的出处呢? 在Java中,使用call stack来记录方法调用顺序.当Java程序发生