Android 中的Looper如何实现阻塞与唤醒的

本文介绍了eventfd在Linux中的作用,包括参数解析、读写操作及其行为,并通过示例代码展示其工作原理。接着探讨了Android Looper如何利用eventfd实现线程的阻塞与唤醒,特别提到了systemcorelibutilsLooper.cpp中的关键函数rebuildEpollLocked()。
摘要由CSDN通过智能技术生成

说该问题之前我们需要首先介绍一下eventfd的作用:

一、eventfd作用

#include <sys/eventfd.h>
int eventfd(unsigned int initval, intflags);
参数解释:
如果是2.6.26或之前版本的内核,flags 必须设置为0。


Initval:初始化计数器值,该值(暂时取名为A)保存在内核。


Flags支持一下标志位:
EFD_NONBLOCK        类似于使用O_NONBLOCK标志设置文件描述符。
EFD_CLOEXEC         类似open以O_CLOEXEC标志打开, 
O_CLOEXEC           应该表示执行exec()时,之前通过open()打开的文件描述符会自动关闭测试时,
在open()之后,调用一下exec(),在新的进程中检测描述符是否已经关闭


返回值:
函数返回一个文件描述符,与打开的其他文件一样,可以进行读写操作。




read/write操作返回的文件描述符
Read:如果计数器A的值不为0时,读取成功,获得到该值。
      如果A的值为0,非阻塞模式时,会直接返回失败,并把error置为EINVAL
      如果为阻塞模式,一直会阻塞到A为非0为止。
Write:将缓冲区写入的8字节整形值加到内核计数器上,即会增加8字节的整数在计数器A上࿰

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值