Linux eventfd 原理与实践

本文摘自写给应用开发的 Android Framework 教程 ,完整教程请查阅 yuandaimaahao.github.io/AndroidFram... 更为详细的视频教程与答疑服务,请联系微信 zzh0838

1. 基本原理

eventfd 是 Linux 2.6.27 添加了一个新的特性,用来实现多进程或多线程的之间的事件通知的,也可以由内核通知用户空间应用程序。

eventfd 通过一个进程间共享的 64 位计数器完成进程间通信,这个计数器在 linux 内核空间维护,用户可以通过调用 write 方法向内核空间写入一个 64 位的值,也可以调用 read 方法读取这个值。

eventfd 有三个常用的操作:

  • 初始化:给内核计数器赋初始值,一般为 0
  • 写操作:递增内核计数器
  • 读操作:当内核计数器为 0 时,读操作阻塞,当内核计数器大于 0 时,读操作不会阻塞

2. eventfd 的使用

2.1 初始化

使用 eventfd 函数来进行初始化:

cpp 复制代码
#include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);
  • initval:创建eventfd时它所对应的 64 位计数器的初始值;
  • flags: eventfd文件描述符的标志,用以改变 eventfd 的行为,大多情况设置为 0 即可。
    • 如果是2.6.26或之前版本的内核,flags 必须设置为 0
    • EFD_CLOEXEC (since Linux 2.6.27):文件被设置成 O_CLOEXEC,创建子进程 (fork) 时不继承父进程的文件描述符
    • EFD_NONBLOCK(since Linux 2.6.27):设置文件描述符为非阻塞的,设置了这个标志后,如果没有数据可读,就返回一个 EAGAIN 错误,不会一直阻塞。
    • EFD_SEMAPHORE (since Linux 2.6.30):提供类似信号量语义的 read 操作,简单说就是计数值 count 递减 1。可以多次 read

举个例子:

cpp 复制代码
int efd = eventfd(0, 0);
if (efd == -1)
{
    handle_error("eventfd");
} 

2.2 读写操作

初始化后的 eventfd,在内核中有一个 64 位的整数与之对应,我们可以通过 read/write 系统调用来修改这个数字。

write 的时候,累加计数:

c 复制代码
uint64_t u = 1;
ssize_t n;

// 写 eventfd,必须是 64 位整数
// 内部计数器变为 1
n = write(efd, &u, sizeof(uint64_t));

// 内部计数器变为 3
u = 2;
n = write(efd, &u, sizeof(uint64_t));

// 内部计数器变为 6
u = 3;
n = write(efd, &u, sizeof(uint64_t));

read 的时候,读出计数器的值,并将内核中的计数器赋值为 0:

c 复制代码
n = read(efd, &u, sizeof(uint64_t));

参考资料

相关推荐
雮尘1 小时前
Android性能优化之枚举替代
android
2501_915909063 小时前
苹果上架App软件全流程指南:iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传与审核技巧详解
android·ios·小程序·https·uni-app·iphone·webview
2501_915921433 小时前
iOS 文件管理与能耗调试结合实战 如何查看缓存文件、优化电池消耗、分析App使用记录(uni-app开发与性能优化必备指南)
android·ios·缓存·小程序·uni-app·iphone·webview
2501_915918414 小时前
App 苹果 上架全流程解析 iOS 应用发布步骤、App Store 上架流程
android·ios·小程序·https·uni-app·iphone·webview
2501_916007474 小时前
苹果上架全流程详解,iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传与审核要点完整指南
android·ios·小程序·https·uni-app·iphone·webview
PuddingSama6 小时前
Android 高级绘制技巧: BlendMode
android·前端·面试
2501_915921436 小时前
iOS App 性能监控与优化实战 如何监控CPU、GPU、内存、帧率、耗电情况并提升用户体验(uni-app iOS开发调试必备指南)
android·ios·小程序·uni-app·iphone·webview·ux
Digitally6 小时前
如何将视频从安卓手机传输到电脑?
android·智能手机·电脑
CV资深专家6 小时前
Android 相机框架的跨进程通信架构
android
前行的小黑炭7 小时前
Android :如何提升代码的扩展性,方便复制到其他项目不会粘合太多逻辑,增强你的实战经验。
android·java·kotlin