在进行 Input 系统分析之前,先简单学习一下 Input 系统和 linux 交互的几个方法,因为 epoll 机制是 InputManagerServer 和 linux 设备节点交互的主要工具。另外只是单存的使用接口,粗略的理解一下其原理,具体 epoll 机制不做深究。目前参考了书籍后整理了一下如下内容。

INotify

INotify 是 Linux 内核所提供的一种文件系统变化的通知机制。可以为应用程序监控文件系统的变化,如:文件的新建、删除、读写等。 INotify 机制有两个基本对象,分别为 inotify 对象和 watch 对象,都使用文件描述符表示。

INotify 对象

inotify 对象可以监听多个事件,当所监听的事件发生时,可以通过 read() 函数从该对象中获取事件信息。创建事件的方法如下:

int inotifyFd = inotify_init();
复制代码

watch 对象

watch 对象用来描述需要监听的变化事件,包含两部分,监听目标和监听事件。监听目标是指文件系统当中的一个路径,可以是文件,也可以是文件夹。事件掩码则是文件系统事件的变化类型,比如文件的创建 (IN_CREATE) 和删除 (IN_DELETE)。如果我们希望将监听事件的 watch 对象添加进 inotify 对象中,需要使用以下代码:

int wd = inotify_add_watch(inotifyFd, "/dev/input", IN_CREATE | IN_DELETE);
复制代码

当我们添加了 watch 对象后,如果 watch 对象所描述的监听事件发生时,可以通过 read() 方式将为读取的事件信息读取出来。

size_t len = read(inotifyFd, events_buf, BUF_LEN);
复制代码

Epoll 机制

以 input 系统为例,我们要响应所有的设备类型,就相当于要监听每一个设备节点的 input事件。那如果采用轮询或者创建线程去读取的话,都会造成资源的极度浪费。这里便可以采用 Epoll 机制。Epoll 机制可以监听多个描述符的可读可写状态。

创建 epoll 对象,这个对象代表了可以监听的描述符的最大数量:

int epfd = epoll_create(MAX_FDS);
复制代码

填充结构体,添加进监听列表:

// epfd epoll 对象的描述符
// EPOLL_CTL_ADD 添加或者删除的事件操作
// listeningFd 监听事件的描述符
// eventItem 是一个 epoll_data_t 结构体的实例,
result = epoll_ctl(epfd, EPOLL_CTL_ADD, listeningFd, &eventItem);
复制代码

等待事件,知道第一个事件发生后才会返回:

epoll_wait(int epfd, stuct epolll_event * events, int maxevents, int timeout);
复制代码

设备节点监听--走在 input 分析之前相关推荐

  1. 实时监听div,input内容改变并获取值(包括脚本动态添加)

    在DOM中可以通过DOMNodeInserted和DOMNodeRemoved这两个事件来监视DOM元素的插入和移除. <!doctype html> <html lang=&quo ...

  2. 将 Flutter 应用程序连接到 BLE 设备并监听数据

    什么是低功耗蓝牙? 它是诺基亚于 2006 年创建的一种无线传输技术,是一种基于蓝牙的开放标准 [1].低功耗蓝牙 (BLE)提供 API,应用程序可以使用这些 API 来发现设备.查询服务和传输信息 ...

  3. Android的Usb设备的监听(Dev)外设端口的判定以及耳机的插拔

    最近在公司用到外设,需要判断接入的外设的VendorId和ProductId,然后给大家说一下自己的学习成果把 ,首先我门可以通过android.hardware.usb.action.USB_STA ...

  4. android animatorset 监听,Android源码分析--动画框架AnimatorSet

    这一节,我要介绍的是AnimatorSet. 一提到android的动画,一定会涉及到AnimatorSet,因为他太好用了.它所封装的接口让很多复杂的动画叠加变得容易. AnimatorSet是继承 ...

  5. vue如何监听多个input框_vue中两个input框输入值,自动计算总和到另一个Input框,怎么实现...

    computed:{ sum(){ return parseFloat(this.form.add1) + parseFloat(this.form.add2) } } v-model = 'sum' ...

  6. android 柱状图 监听,Android 开源柱状图分析实现

    在平时开发中柱状形状偶尔会有项目需求,由于又一次开发需要,去找开源的组件都不好用,要不调用很不方便,要不它们类库太笨重,下面介绍一个轻巧方便控件,原理就是用View 重新绘画一个柱状图形控件,并适配所 ...

  7. jquery --- 监听input框失效

    使用juery监听Input输入的变化,并且封装起来,如下: // html <input type="text" id='myinput1' /> // js fun ...

  8. Linux: 设备节点创建移除过程简析

    文章目录 1. 前言 2. 分析背景 3. 设备节点的创建和移除 3.1 通过 devtmpfs 创建移除设备节点 3.1.1 devtmpfs 初始化 3.1.2 通过 devtmpfs 创建设备节 ...

  9. watch监听和computed计算属性的使用和区别

    watch和computed的区别: computed : 支持缓存,只有依赖数据发生改变,才会重新进行计算 不支持异步,当computed内有异步操作时无效,无法监听数据的变化 3.computed ...

最新文章

  1. python中ht表示什么_如何看待某国内大公司Python面试题,有关dict中初始化为固定值?...
  2. 【youcans 的 OpenCV 例程200篇】114. 形态学操作之膨胀
  3. Hibernate Session merge,update,save,saveOrUpdate,persist
  4. Mac下安装virtualenvwrapper提示ERROR: No matching distribution found for pbr
  5. 4月26 simulink数据input,与全局变量建立堆栈
  6. objdump选项解释
  7. C99标准的新特性介绍
  8. 【资料】avr单片机和stm32区别,avr单片机选型技巧
  9. 解读OOM killer机制输出的日志
  10. 前端框架Vue(15)——vue-cli 仿网易云音乐 Demo,环境搭建到开发 Vue 全家桶练手项目
  11. v-model中修饰符lazy,number, trim的作用
  12. Windows***与提权技巧汇总
  13. 【统计学习系列】多元线性回归模型(五)——参数与模型的显著性检验:t检验与F检验
  14. 最佳实践 缓存穿透,瞬间并发,缓存雪崩的解决方法
  15. 数学-快速心算:快速心算
  16. 工地反光衣穿戴检测算法
  17. 修改autor后面邮箱_最后冲刺!2020年国自然标书终极修改和形式审查要点!!!...
  18. 安装Java错误1603
  19. 破解版IDM导致电脑反复闪屏的解决方案
  20. 相约上海,以边缘计算之名!

热门文章

  1. linux设置ulimit值永久生效
  2. 【转】在OpenGL场景中实现小地图功能
  3. 88e1111光电选择配置说明
  4. python字符串去重保持原顺序_python实现文本去重且不打乱原本顺序
  5. mysql为什么每天0点就装东西_MySQL的详细安装教程
  6. 项目的技术路线怎么写_资讯丨空压机节能改造项目技术路线
  7. 0x00000000指令引用的内存不能为written_jvm的内存结构
  8. 计算机科学与技术类高水平国际学术刊物,莘莘学子 | 计算机科学与技术学院本科生薛传雨在国际期刊上发表高水平学术论文...
  9. java异常return笔试题_Java笔试面试总结—try、catch、finally语句中有return 的各类情况...
  10. Rust 数据类型介绍