Linux 新api eventfd

一起来感受下eventfd的魅力(一、eventfd使用介绍) 写在前面 #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); eventfd()函数可以创建一个被用户空间应用程序作为“等待/通知”机制使用的eventfd对象,或被内核用于通知用户空间应用程序事件消息。eventfd对象包含一个uint64_t类型计数器,由内核进行维护。该计数器通过参数interval进行初始化。 eventfd()函数返回一个文件描述符,这个fd用 阅读详情
eventfd 在内核版本,2.6.22以后有效。查看内核版本可以用命令 uname -r 。

1 #include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);

这个函数会创建一个 事件对象 (eventfd object), 用来实现,进程(线程)间 的 等待/通知(wait/notify) 机制. 内核会为这个对象维护一个64位的计数器(uint64_t)。
 并且使用第一个参数(initval)初始化这个计数器。调用这个函数就会返回一个新的文件描述符(event object)。2.6.27版本开始可以按位设置第二个参数(flags)。
有如下的一些宏可以使用:

EFD_NONBLOCK , 功能同open(2) 的O_NONBLOCK,设置对象为非阻塞状态,如果没有设置这个状态的话,read(2)读eventfd,并且计数器的值为0 就一直堵塞在read调用当中,要是设置了这个标志, 就会返回一个 EAGAIN 错误(errno = EAGAIN)。效果也如同 额外调用select(2)达到的效果。

EFD_CLOEXEC 我的理解是,这个标识被设置的话,调用exec后会自动关闭文件描述符,防止泄漏。

如果是2.6.26或之前版本的内核,flags 必须设置为0。

创建这个对象后,可以对其做如下操作。

write 将缓冲区写入的8字节整形值加到内核计数器上。

read 读取8字节值, 并把计数器重设为0. 如果调用read的时候计数器为0, 要是eventfd是阻塞的, read就一直阻塞在这里,否则就得到 一个EAGAIN错误。
如果buffer的长度小于8那么read会失败, 错误代码被设置成 EINVAL。

poll select epoll

close 当不需要eventfd的时候可以调用close关闭, 当这个对象的所有句柄都被关闭的时候,内核会释放资源。 为什么不是close就直接释放呢, 如果调用fork 创建
进程的时候会复制这个句柄到新的进程,并继承所有的状态。


下面是一个例子
 1 #include <sys/eventfd.h>
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 #include <stdint.h>
 5 #include <stdlib.h>
 6 #include <errno.h>
 7 
 8 #define handle_error(msg) \
 9     do { perror(msg); exit(1); } while (0)
10 
11 int main( int argc, char **argv )
12 {
13     uint64_t u;
14     ssize_t s;
15     int j;
16     if ( argc < 2 ) {
17         fprintf(stderr, "input <num> in command argument");
18         exit(1);
19     }
20 
21     int efd;
22     if ( (efd = eventfd(0, EFD_NONBLOCK)) == -1 )
23             handle_error("eventfd failed");
24 
25 
26     switch (fork()) {
27         case 0:
28             for( j = 1; j < argc; j ++ ) {
29                 printf("Child writing %s to efd\n", argv[j] );
30             
31                 u = strtoull(argv[j], NULL, 0);  /* analogesly atoi */
32                 s = write(efd, &u, sizeof(uint64_t)); /* append u to counter */
33                 if ( s != sizeof(uint64_t) )
34                     handle_error("write efd failed");
35 
36             }
37             printf("child completed write loop\n");
38 
39             exit(0);
40         default:
41             sleep (2);
42             
43             printf("parent about to read\n");
44             s = read(efd, &u, sizeof(uint64_t));
45             if ( s != sizeof(uint64_t) ) {
46                 if (errno = EAGAIN) {
47                     printf("Parent read value %d\n", s);
48                     return 1;
49                 }
50                 handle_error("parent read failed");
51             }
52             printf("parent read %d , %llu (0x%llx) from efd\n", 
53                     s, (unsigned long long)u, (unsigned long long) u);
54             exit(0);
55 
56         case -1:
57             handle_error("fork ");
58     }
59     return 0;
60 }

这个API还是很有用的, 当你想要编写并发型服务器的时候,aventfd 可以完美取代 pipe去通知(唤醒)其他的进程(线程)。比如经典的异步IO reactor/selector
应用场景,去唤醒select的调用。他的缓冲区处理非常方便, 规定只有8字节。
Linux新增API:eventfd Linux新增API:eventfd 进程间等待通知机制 eventfd API int eventfd(unsigned int initval, int flags); 用来创建一个用于事件通知的eventfd对象 返回值为一个int型fd,用来引用打开的对象 打开的对象在内核中是一个64位无符号整型数据,初始化位initval 计数器数据类型:typedef uint64_t eventfd_t flags: EFD_CLOEXEC:类似于open的flags,fork子进 阅读详情

相关推荐

从零开始,用Cadence Virtuoso手把手仿真一个1.5V LDO(附完整电路与仿真脚本)

本文详细介绍了如何使用Cadence Virtuoso从零开始仿真一个1.5V LDO,包括环境准备、电路导入、Testbench构建、核心仿真类型分析以及高级调试技巧。通过完整的电路与仿真脚本,帮助读者掌握LDO设计与仿真的关键技术,提升电路设计能力。

weixin_31309419的博客 445

linux之eventfd理解

在阅读fdbus源码的过程中涉及到了eventfd,这块不是很熟悉,特此记录一下。在linux下一切皆文件,每个文件都都对应一个fd(file descriptor文件描述符),要理解eventfd,就需要对fd的类型有一个认识,fd也是有类型的,我们都知道socket fd,也知道pipe fd,timer fd,同样也有eventfd这样一种类型。

漫步者 2200

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2003

使用eventfd唤醒阻塞在select、poll、epoll的IO复用

还是以muduo为例: EventLoop中有两个成员变量与唤醒阻塞的IO复用有关,wakeupFd_与wakeupChannel_; class EventLoop : noncopyable { public: ... void wakeup(); ... private: ... void handleRead(); // waked up private: int wak...

xupeng1644的博客 2739

解决[WARN] : Controller Spawner couldn‘t find the expected controller_manager ROS interface.思路

rrbot例程ros_control配置问题的解决思路 本人刚入门ROS机器人开发,在学习rrbot例程出现了control_manager无法启动的bug。 在启动rrbot_control.launch的时候,出现下列warning: [WARN] [1594362016.372059]: Controller Spawner couldn't find the expected controller_manager ROS interface. 之后再按教程的步骤 rosservice call /

qq_40299650的博客 1万+

基于Android平台下的健康管理APP/基于android的健康管理系统

随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。Android技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于Android技术平台的健康管理APP,开发这款健康管理APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了健康管理APP的界面设计及使用,主要包括界面的

m0_73706453的博客 1437

eventfd与多路复用结合实现进程/线程间通讯

eventfeventfd是Linux2.6.27内核版本加入的系统调用,主要可以用来进程/线程间通讯。用法很简单,通过调 用inteventfd(unsignedintinitval,intflags)函数返回一个文件描述符,通过read和write函数进行进程/线程间通讯。 调用eventfd函数会创建一个eventfd对象,可以被用户空间的应用程序用来作为事件等待/通知机制。eventfd函数返回eventfd对象的文件描述符,通过操作文件描述符来进行事件等待和...

凌云天空的博客 914

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1344

linux新API--eventfd的使用方法

eventfd 在内核版本,2.6.22以后有效。查看内核版本可以用命令 uname -r 。 [cpp] view plaincopyprint?  #include  int eventfd(unsigned int initval,int flags); 这个函数会创建一个 事件对象 (eventfd object), 用来实现,进程(线程)间的

鱼思故渊的专栏 1万+

RACECAR底层平台安装:Jetson Nano+ROS Melodic全栈部署指南

移动机器人开发中,底层平台安装是将硬件转化为可编程移动平台的关键起点。其核心在于嵌入式系统、ROS中间件与传感器驱动的深度协同——需兼顾内核模块加载、GPIO/PWM精确控制、I2C设备初始化及ROS工作空间构建等多层技术耦合。尤其在竞速级小车如RACECAR场景下,Jetson Nano的硬件加速能力、MPU6050 IMU固件加载、TB6612FNG电机驱动配置等细节,直接决定运动控制精度与实时性。本文聚焦Ubuntu 18.04 + ROS Melodic + JetPack 4.4.1技术栈,覆盖从

weixin_32025789的博客 255

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

我们简单拆解了MIG AXI接口中测试文件的整体框架,首先在sim_tb_top.sv文件中例化了DDR模型和example_top。在example_top中,又例化了MIG IP和一个流量产生器ddr4_v2_2_8_axi_tg_top。在ddr4_v2_2_8_axi_tg_top中的主要功能是分别例化了boot_mode_gen,prbs_mode_gen,custom_mode_gen和axi_opcode_gen。

apple_53311083的博客 1587

linux新api eventfd

http://www.cppblog.com/peija/archive/2010/10/07/128941.html?opt=admin 源码 http://www.oschina.net/code/explore/linux-2.6.36/fs/eventfd.c

走在左边 116

5G/NR 网络切片基本概念(协议版)

26.1 网络切片概念 网络切片是一个概念,可以根据每个客户的要求进行区别对待。通过切片的形式,将不同流量差异化处理,以及可以将资源进行隔离,然后移动网络运营商可以将客户视为属于不同租户类型的客户,每种客户具有不同的服务要求,这些要求根据每个租户根据SLA (Service Level Agreement,服务水平协议)可以使用哪种切片类型进行管理和订阅。 网络切片始终由RAN部分和CN部...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 1万+

Linux 新api eventfd(转)

转自http://www.cppblog.com/peija/archive/2010/10/07/128941.html eventfd 在内核版本,2.6.22以后有效。查看内核版本可以用命令 uname -r 。 1 #include 2 int eventfd(unsigned int initval, int flags); 这个函数会创建一个 事件对象 (eventf

guaishushu1ss的博客 305

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux新的API signalfd、timerfd、eventfd使用说明

三种新的fd加入linux内核的的版本: signalfd:2.6.22 timerfd:2.6.25 eventfd:2.6.22 三种fd的意义: signalfd:传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、pol

Linux平台软件设计与开发 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux线程通信eventfd

概述 eventfd是linux新加入的API(2.26.22内核之后),为用户空间应用程序提供等待(wait)和通知(notify)机制,函数eventfd创建的fd可以加入epoll。eventfd()创建一个“eventfd对象”, 通过它能够实现用户态程序间(我觉得这里主要指线程而非进程)的等待/通知机制,以及内核态向用户态通知的机制(未考证)。此对象包含了一个被内核所维护的计数(ui...

paradox_1_0的博客 518

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: Linux 新增系统调用的启示
下一篇: 系统调用和c库之间的关系
刘军卫
博客等级 码龄19年 1143粉丝 245原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值