Android系统--输入系统(一)必备的Linux知识_inotify和epoll

引入

1. 笔记本电脑插入外接键盘,两个键盘都可以使用

a. 键盘即插即用--如何检测键盘的接入和拔出

  • hotplug机制:内核发现键盘接入或拨出之后启动hotplug进程,进程发出信号告诉输入系统,输入系统处理

  • inotify机制:输入系统使用inotify检测/dev/input的节点变化

b. 可用使用多键盘--如何知道哪个键盘被按下

  • epoll机制:可以检测多个事件

c. 如何使用inotify和epoll机制:

(1) inotify使用(用于检测目录或者文件的变化)

  • 初始化得到文件句柄--fd=inotify_init();

  • 检测对象--inotify_add_watch(fd,目录/文件,创建/删除);

  • 对象变化--read();返回一个或者多个结构体:struct inotify_event

           struct inotify_event {__s32 wd;__u32 mask;    //发生的变化状态__u32 cookie;__u32 len;     //name的长度char name[0];  //发生变化的文件}
范例代码:

inotify.c

*Author  : LKQ*Date    : 2017-2-23*Desc    : use inotify watch dir change*参考: frameworks\native\services\inputflinger\EventHub.cpp*//*Usage: inotify <dir> */#include <unistd.h>#include <stdio.h>#include <sys/inotify.h>#include <string.h>#include <errno.h>int read_process_inotify_fd(int fd){int res;char event_buf[512];int event_size;int event_pos = 0;struct inotify_event *event;/* read */  res = read(fd, event_buf, sizeof(event_buf));  //return a struct if(res < (int)sizeof(*event)) {if(errno == EINTR)return 0;printf("could not get event, %s\n", strerror(errno));return -1;}   //procee : read a and more inotify_event//deal with each struct 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) {printf("create file: %s\n", event->name);} else {printf("delete file: %s\n", event->name);}}event_size = sizeof(*event) + event->len;res -= event_size;event_pos += event_size;}return 0;}int main(int argc,char **argv){int mINotifyFd;int result;if(argc != 2){printf("Usage : %s <dir> \n",argv[1]);}/*1. inotify init*/mINotifyFd = inotify_init();    /*2. add watch*/result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE); /*3. read*/while (1){read_process_inotify_fd(mINotifyFd);}return 0;}
使用过程:

gcc -o inotify inotify.c

mkdir tmp

./inotify tmp &

echo > tmp/1

echo > tmp/2

rm tmp/1 tmp/2

(2) epoll使用(用于检测多个文件:1. 有无数据可供读取;2. 有无空间写入)

  • 初始化得到文件句柄--fd=epoll_create();

  • 对于每一个文件执行epoll_ctl(fd,EPOLL_CRTL_ADD,...);表示监测该文件的行为

  • epoll_wait();等待某个文件可用epoll_ctl(fd,EPOLL_CRTL_DEL,...);

范例代码:

epoll.c


/**Author  : LKQ*Date    : 2017-2-23*Desc    :how to use epoll*参考: frameworks\native\services\inputflinger\EventHub.cpp*//* usage: epoll <file1> [file2] [file3] ... */#include <stdio.h>#include <sys/epoll.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#if 0typedef union epoll_data {void        *ptr;int          fd;uint32_t     u32;uint64_t     u64;} epoll_data_t;#endif#define DATA_MAX_LEN 512int add_to_epoll(int fd, int epollFd){int result;struct epoll_event eventItem;memset(&eventItem, 0, 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 i;char buf[DATA_MAX_LEN];// Maximum number of signalled FDs to handle at a time.static const int EPOLL_MAX_EVENTS = 16;// The array of pending epoll events and the index of the next event to be handled.struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS];if (argc < 2){printf("Usage: %s <file1> [file2] [file3] ...\n", argv[0]);return -1;}/*1. epoll create*/mEpollFd = epoll_create(8); /*2.  for each file:*      open it*      add it to epoll: epoll_ctl(...EPOLL_CTL_ADD...)*/for(i=1;i<argc;i++){//int tmpFd = open(argv[i], O_RDONLY|O_NONBLOCK);int tmpFd = open(argv[i],O_RDWR);add_to_epoll(tmpFd,mEpollFd);}/*3.  epoll_wait */while (1){int pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, -1);for (i = 0; i < pollResult; i++){printf("Reason: 0x%x\n", mPendingEventItems[i].events);int len = read(mPendingEventItems[i].data.fd, buf, DATA_MAX_LEN);buf[len] = '\0';printf("get data: %s\n", buf);}}/*remove epoll*/for(i=1;i<argc;i++){rm_from_epoll(mPendingEventItems[i].data.fd,mEpollFd);}return 0;}
操作方法:

gcc -o epoll epoll.c

mkdir tmp

mkfifo tmp/1 tmp/2 tmp/3

./epoll tmp/1 tmp/2 tmp/3 &

echo aaa > tmp/1

echo bbb > tmp/2

echo ccc > tmp/3

补充:

当fifo文件以 O_RDONLY|O_NONBLOCK 方式打开,会出现不断返回epoll_wait,导致崩溃。

原因:使用fifo是, 我们的epoll程序是reader;echo aa > tmp/1 是writer

a. 如果reader以 O_RDONLY|O_NONBLOCK打开FIFO文件,writer写入数据时, epoll_wait会立刻返回;
当writer关闭FIFO之后, reader再次调用epoll_wait, 它也会立刻返回(原因是EPPLLHUP, 描述符被挂断)

b. 如果reader以 O_RDWR打开FIFO文件当writer写入数据时, epoll_wait会立刻返回;
当writer关闭FIFO之后, reader再次调用epoll_wait, 它并不会立刻返回, 而是继续等待有数据

转载于:https://www.cnblogs.com/lkq1220/p/6434184.html

Android系统--输入系统(一)必备的Linux知识_inotify和epoll相关推荐

  1. Android系统--输入系统(八)Reader线程_使用EventHub读取事件

    Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...

  2. Android Input 输入系统学习

    原文在https://blog.csdn.net/kehyuanyu/article/details/48573211 Android输入设备的映射 使用指令dumpsys input 可以看到以下信 ...

  3. 软件测试必备的Linux知识(一)

    1. Linux 概述 1.1 测试人员为什么学习linux 对于软件测试人员来说,我们测试的任何产品都是基于操作系统.比如我们每天都在使用的QQ软件,它有windows.ios.Android.Ma ...

  4. Android | 输入系统(IMS)

    前言 一般情况下很多同学对于点击事件的认识都只存在于从 Activity 开始的,然后从 Window 中进行分发,甚至有些人可能也只知道 onTouchEvent 和 dispatchTouchEv ...

  5. Android输入系统IMS(1)--基础知识epoll和notify

    做Android系统三年多,量产项目也有3~4个了,却从来没写过相关博客,最近换工作到新东家报道前这段时间比较闲写写博客总结一下这些年对Android系统的了解.先挑个相对简单的ims下手. epol ...

  6. 清华学姐熬了一个月肝出这份32W字Linux知识手册,在 Github标星31K+

    今天整理了一些软件测试必备之Linux 知识,希望能对你有帮助! 这里赠送一套软件测试相关资源: 软件测试相关工具 软件测试练习集 深入自动化测试 Python学习手册 Python编码规范 大厂面试 ...

  7. android 输入法框架,Android输入系统(2)——输入系统框架(Android+Linux)

    1.优秀文档 android输入系统官方文档:http://source.android.com/devices/input/index.html 中文官方文档 <深入理解Android 卷II ...

  8. Android系统的50大必备秘籍(仅限初级用户)

    虽然Android 操作系统的用户界面和交互经过两年的发展已经非常人性化,但是有些操作和使用还是让很多刚接触的菜鸟用户感到复杂和困惑.我们整理出Android系统的50大必备秘籍供用户参考,适合各种阶 ...

  9. android dispatch input输入子系统,10.12 android输入系统_InputStage理论

    android应用程序对输入系统的处理分为多个阶段,我们把这些阶段称为InputStage 理论处理流程: (1)activity发给window,如果window不能处理,再由activity处理; ...

最新文章

  1. 女朋友让我给她讲讲什么是比特币,她想买两个。
  2. 牛客c语言数组,牛客网学习笔记 - C/C++
  3. 7 1学会使用 Node 编写简单的前端应用
  4. 在loadrunner中使用winsocket协议编写脚步三部曲
  5. Java中JSON字符串与java对象的互换实例详解
  6. 在护卫神上部署javaWeb项目,已经测试通过
  7. MEF: MSDN 杂志上的文章(15) 拒绝【多个导出,但只用一个导入,会拒绝,但还是稳定的组合】...
  8. python获取字典长度_Python基础-字典
  9. python 文件相似度分析_使用Python做人群相似度分析
  10. 拓扑检查C++(ArcObject)
  11. windows server 2012 st 版本的php环境问题修复 与删除
  12. 让别人查看云服务器的文件夹,让别人查看云服务器的文件夹
  13. truecrypt linux用法,TrueCrypt介绍及入门使用讲解【翻译】
  14. JITSI开源视频直播
  15. 计算机编程入门先学什么最好?
  16. 洛谷 P3373 线段树2
  17. 文化网页设计成品 web网页设计实例作业 ——古典中国风工艺美术(9页) html+css+javascript网页设计实例
  18. 什么是勒索病毒,勒索病毒简介,电脑中病毒了怎么修复
  19. 消息中间件架构面面观
  20. 光脚丫学LINQ(017):跨关系查询(C#):手动编码

热门文章

  1. 在vs2010中使用nuget安装EF5报错解决方案
  2. yii框架相关知识(转)
  3. 雪鹰领主服务器维护,《雪鹰领主》7月14日维护更新公告
  4. 开发源码常用网站参考
  5. Leetcode 171. Excel表列序号 解题思路及C++实现
  6. 用python画蝴蝶_图形化编程经验分享,画笔基础,软件包括Python、Kittenblock
  7. unity game和scene效果不一样_都说水泥漆和乳胶漆只是叫法不一样,对房子装修效果一样,事实呢...
  8. 案例:验证用户名是否可用
  9. Linux 技术篇-使用vim命令创建、编辑文件内容实例演示,linux修改文档方法
  10. ARM--MDK5 Software Packs下载