Looper对文件描述符的监控与处理

上面提到的管道的读端是一种文件描述符,那么其他的文件描述符,如普通的文件、设备文件和套接字(包括套接字对)等的描述符,都可以被Looper用来监控,实现类似于上面的消息队列的唤醒和处理机制。通常,消息是通过消息队列发送的,也可以通过套接字(比如已建立好连接的套接字)、设备文件来发送;当然,也包括管道。对一个文件描述符进行监控后,只要有可I/O事件发生,那么调用了pollOnce的调用者(如某个线程)将被唤醒,然后就可调用指定的处理者(如回调函数)对到来的数据(若为可读事件的话)进行处理。

Looper提供了addFd函数用于添加需要监控的文件描述符,这个文件描述符由调用者指定,调用者还须指定对何种I/O(可读还是可写)事件进行监控。另外,也可指定用于处理可I/O事件时的回调处理函数(及其需用到的私有数据)。

可在LooperCallback的子类中重载handleEvent来实现对可I/O事件的处理。LooperCallback的定义如下(见文件Looper.h):


注意:如上述代码注释所示,当handleEvent返回0时,表示处理完后将注销对该文件描述符的监控,返回1将继续监控。也可实现如下类别(见文件looper.h,注意是小写,它是不同路径下的不同的文件)的回调函数,在其中实现对可I/O事件的处理,然后指定给addFd函数,代码如下:


事实上,该回调函数最终被封装到下面的类中(见文件Looper.h):


Looper的addFd函数的前半部分主要是检查传递进来的各个参数(见文件Looper.cpp):


后半部分则让epoll监控文件描述符(见下面的行440),若已存在,则修改替换(行447)。同时会新建一个文件描述符监控请求项request添加到Request列表mRequests中(行445)。若已存在,则替换原有项(行452)。


当有可I/O事件如有可读数据到来,则调用了pollOnce/pollInner的调用者将从pollInner中的epoll_wait的睡眠等待上醒来,开始执行后面的代码。如下面的pollInner的代码片段所示:


它首先检查是不是因为管道上有数据被唤醒,不是的话(行256处的else分支),则表示是采用addFd添加的文件描述符上有数据事件产生。在确定是来自哪个描述符监控请求项后(行257),再确定是何种事件(行260~263)。接着,将这些信息作为回复Response压入到回复队列中,pollInner后面的代码将对该队列继续处理。这样做,是为了对事件做出快速响应,记录下它后,后面再继续对事件做进一步处理。pollInner函数的后面代码片段如下:


因此,借助于Looper的pollOnce和addFd函数,可以实现对文件描述符的监控。无数据到来时pollOnce的调用者将睡眠等待,有数据到来时其被自动唤醒,并执行指定的回调处理者(若有的话)。

本文节选自《深入剖析Android系统》一书

杨长刚著

电子工业出版社出版

Looper对文件描述符的监控与处理相关推荐

  1. 一文帮你搞懂 Android 文件描述符

    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏. 一.什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 于Linux 系统 ...

  2. Select()系统调用及文件描述符集fd_set的应用

    在网络程序中,一个进程同时处理多个文件描述符是很常见的情况.select()系统调用可以使进程检测同时等待的多个I/O设备,当没有设备准备好时,select()阻塞,其中任一设备准备好时,select ...

  3. jvm 助记符_您的JVM是否泄漏文件描述符-像我的一样?

    jvm 助记符 前言:此处描述的两个问题是在一年前发现并修复的. 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快 ...

  4. 您的JVM是否泄漏文件描述符-像我的一样?

    前言:此处描述的两个问题是在一年前发现并修复的. 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快速且无垃圾的有效 ...

  5. linux文件描述符导致squid拒绝服务

    linux文件描述符导致squid拒绝服务   前几天因工作需要在RHEL4.8上面架设了一个squid双网代理,刚开始测试一切正常,然后就在前台负载均衡服务器把这个代理地址加上,运行一段时间后,客服 ...

  6. 6.11 通过文件描述符来获取信号

    6.11 通过文件描述符来获取信号 从内核2.6.22版本开始,Linux提供了另外一种机制来接收信号:通过文件描述符来获取信号即signalfd机制. 这个机制和sigwaitinfo非常地类似,都 ...

  7. 【戒焦戒躁,can win】Linux--IO文件描述符

    回忆 C 语言文件操作 fopen 当前工作目录 fputs fgets 由 C 文件操作引出的问题 系统级别IO 打开文件 系统级别文件管理 文件构成 文件与进程关联 write底层流水线 read ...

  8. /etc/security/limits.conf 控制文件描述符,进程数,栈大小等

    linux下安装Oracle 一般都会修改/etc/security/limits.conf这个文件,但是这里面的具体含义未必每个人都会,刚开始我也不是很清除,只知道要修改,每次安装按照文档配置就可以 ...

  9. java套接字创建失败_Linux的文件描述符个数限制导致创建文件(或socket)失败的问题...

    众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程所有打开的fd.当然有些可能不是本进程自己打开的,如通过fork()从父进程继承而来的.本文着着重讲述socket有关的内容.当我们 ...

  10. 【C/C++服务器开发】文件,文件描述符,I/O多路复用,select / poll / epoll 详解

    文章目录 一.前言 1.文件的概念 2.文件描述符和文件指针 文件描述符 文件描述符和文件指针的区别 文件描述符太多了怎么办 二.I/O多路复用 1.I/O多路复用的由来 不要打电话给我,有需要我会打 ...

最新文章

  1. 利用Use Case为系统行为建模(2)
  2. ECCV 2020 中国预会议 邀请您参加计算机视觉盛宴
  3. 虚拟机的ubunt系统在登录界面循环往复,登录不进去问题
  4. BWA SAM文件格式
  5. android 删除文件
  6. sparksql(1)——Dataframe
  7. int与bigdecimal的相互转换
  8. 关于iconfont的一些东西
  9. Java解析魔兽争霸3录像W3G文件(四):解析游戏进行时的信息
  10. 任天堂Switch最优DNS测试
  11. SpringBoot基础学习之SpringBoot配置(上篇)
  12. python爬虫——爬取豆瓣TOP250电影
  13. python-matplotlib-箱线图为不同的箱体设置不同颜色
  14. 人生感悟:欲望适度则为利,欲望过度则为害,高级java开发工程师简历
  15. html实现点击图片全屏显示,用vue实现点击图片预览浏览器满屏大图
  16. 50Projects50Days--RotatingNavgation
  17. 读取BIL格式高光谱数据——C/C++
  18. 【Hadoop】org.apache.hadoop.security.AccessControlException: Permission denied
  19. AI对联_电脑对联_自动对对联_在线对对联
  20. 分布式日志存储架构设计方案

热门文章

  1. Python中ASCII码的数字和字符的转换
  2. Ubunbu新建的用户使用SecureCrt无法Table补全、无法高亮
  3. java读取照片信息 获取照片拍摄时的经纬度
  4. 使用python读取txt坐标文件生成挖空地块_批量
  5. 20171018 在小程序页面去获取用户的OpenID
  6. python学习笔记__Python的安装
  7. hdu 1874 畅通project续
  8. vc listview 大图标间距设置
  9. iVIEW: An Intelligent Video over InternEt and Wireless Access System
  10. out memory 内存溢出总结