libevent学习笔记七——集成信号事件到事件主循环

libevent中的信号管理 一、前言 Libevent(1.4.13 版本)的源码中,event_base 结构体中的成员 sig 用于管理信号事件,sig 的变量类型为 struct evsignal_info。 二、相关结构体 struct evsignal_info 定义在 evsignal.h 头文件中,如下: typedef void (*ev_sighandler_t)(int); struct evsigna... 阅读详情

概述

在linux系统中有现成的信号捕获接口如sigaction,它可以捕获指定的信号并执行用户自定义信号处理函数,那么如何将这种机制集成到libevent事件管理模型中呢?
libevent采用了socketpair的方式将信号事件集成到了其自身的事件处理模型中。
具体做法如下简述:

  1. 初始化socketpair;
  2. 调用接口sigaction设置指定信号的信号处理函数,该信号处理函数所做工作为向socketpair的写端写入捕获的信号号;
  3. 将socketpair的读端对应的事件添加到libevent事件管理模型中(读端其实就是一个IO事件),读端事件的回调函数所做工作是读取写端写入的信号号并激活用户的signal事件,将其添加到libevent活跃事件队列等待执行;

libevent具体实现

1、 libevent库初始化,使用以下两个接口初始化event库,并且初始化一个event
struct event_base * event_base_new(void);// 该接口内初始化了socketpair
/* Initalize one event */
signal_int = evsignal_new(base, SIGINT, signal_cb, event_self_cbarg());;
2、添加signal事件到event
int event_add(struct event *ev, const struct timeval *tv);

对于signal事件,该接口所做主要工作:
1)、和添加IO事件一样,以信号号为下标添加信号事件到libevent库中;

int evmap_signal_add_(struct event_base *base, int sig, struct event *ev)

2)、添加socketpair读端IO事件到libevent库中;

static int evsig_add(struct event_base *base, evutil_socket_t evsignal, short old, short events, void *p)

3)、设置信号处理函数

int evsig_set_handler_(struct event_base *base, int evsignal, void (__cdecl *handler)(int))
3、 进入事件主循环
int event_base_dispatch(struct event_base *event_base);

当捕获到信号时,信号处理函数将信号号写入socketpair写端,在事件主循环中调用接口

res = evsel->dispatch(base, tv_p);

捕获到此次写事件,激活上述读端IO事件,在读端IO事件中获取写端传来的信号号,将该信号号对应的信号事件添加到活跃事件链表等待执行。

Libevent: 集成signal处理到事件处理主循环中 解析libevent源码,了解集成signal到事件主循环的机制原理 阅读详情

相关推荐

libevent源码分析--定时器和信号事件处理

Timer事件 反应堆event_base包含了一个最小堆min_heap结构体的实例,以此维护注册到这个反应堆实例的定时器事件: view sourceprint? 1.struct event_base { 2.//其他成员 3.struct min_heap timeheap; 4.}; 回顾一下最小堆min_heap: view sour

鱼思故渊的专栏 4671

Libevent之信号事件管理

1、原理性介绍: 1、Linux操作系统,对于信号的处理,都是调用先前注册给系统的回调函数,例如通过sigaction(evsignal, &sa, sig->sh_old[evsignal])注册回调了sa里面的回调函数。当对应的信号到来时候,将调用相应的回调函数。 2、Libevent为了将信号事件和IO事件统一起来,即对于信号的处理也通过epoll可以检测到。因此Libev...

一个菜鸟的博客 2305

Libevent源码分析-----信号event的处理

前面讲解了Libevent怎么对一个IO事件进行监听,现在来讲一下Libevent怎么监听信号。Libevent对于信号的处理是采用统一事件源的方式。简单地说,就是把信号也转换成IO事件,集成到Libevent中。

luotuo44的专栏 9205

基于STM32的FreeRTOS实时操作系统———使用二进制信号量

信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量:- 二进制信号量 计数信号量 互斥体 递归的 Binary Semaphore的工作非常简单。Binary Semaphore之所以称为Binary信号量,是因为它存在(‘1’)或不存在(‘0’)。其中没有第三个条件。因此,任务要么具有信号量,要么根本没有。对于Task,我们可以创建一个条件,使其必须具有信号量才能执行自身。因此,如果Task没有信号灯,则别无选择,

Jodan132的博客 894

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法)

本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。

flower的专栏 743

手把手教你为FPGA项目集成HyperRAM IP核:从AXI接口封装到上板调试全流程

本文详细介绍了如何为FPGA项目集成HyperRAM IP核,涵盖从AXI接口封装到上板调试的全流程。通过对比DDR3L、PSRAM和HyperRAM的性能指标,突出HyperRAM在低功耗和小封装尺寸方面的优势,并提供硬件连接、AXI4-Lite接口设计、状态机优化及调试技巧等实用内容,帮助开发者高效完成FPGA项目中的内存扩展。

weixin_32103009的博客 286

Libevent book 笔记(6) Working with events

文章目录Constructing event objects`event_new()/event_free()`例子The event flagsAbout Event PersistenceCreating an event as its own callback argumentevent_self_cbarg例子Timeout-only eventsConstructing signal events例子Caveats when working with signalsSetting up event

MYTCHITOS的博客 495

手把手教你用Qt和DSP28335实现串口Bootloader,附赠源码和避坑指南

本文详细介绍了如何使用Qt和DSP28335实现串口Bootloader,包括开发环境搭建、通信协议设计、Qt上位机开发、DSP端Bootloader核心实现以及应用程序工程的特殊配置。通过实战案例和源码分享,帮助开发者快速掌握嵌入式固件升级技术,提升工业设备远程升级的效率和可靠性。

weixin_29176179的博客 134

12.libevent循环函数和退出测试

test.cpp #include<iostream> #include<event2/event.h> #include<signal.h> using namespace std; bool isexit = false; //sock 文件描述符,which 事件类型,arg 传递参数 static void Ctrl_C(int sock, short which, void* arg) { cout << "Ctrl C" <<

xiaoduan6的博客 388

Jetson Orin NX系统克隆术:如何快速备份与还原你的开发环境(附完整命令行)

本文详细介绍了Jetson Orin NX系统克隆的完整流程,这是一种超越简单备份的完整镜像方案。通过命令行操作,可实现开发环境(包括引导程序、内核、根文件系统及所有配置)的快速备份与还原,确保批量部署时环境的完全一致性与高效性,尤其适合机器人、边缘AI等项目的团队协作。

weixin_29191081的博客 158

【CVPR2025 DEIM】超详细!手把手训练自己的数据集教学:从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。本文在win系统上训练,最强实时目标检测算法!

本文详细介绍了CVPR2025 DEIM目标检测模型的完整使用流程。内容包含:1)源码下载与虚拟环境配置;2)Visdrone2019数据集准备与配置文件修改;3)训练参数设置及Windows系统常见问题解决方案;4)模型验证、推理测试及热力图生成方法。特别针对Windows用户提供了虚拟环境配置指导,并详细说明了数据集路径设置、参数调整等关键步骤。通过本文的指导,小伙伴可以快速掌握DEIM模型的使用方法,用于学术论文研究和实验分析。

Ai缝合怪、助力小伙伴高效发论文 7650

[libevent]事件主循环

libevent事件处理的中心部分——事件主循环,根据系统提供的事件多路分发机制执行事件循环,对已注册的就绪事件,调用注册事件的回调函数来处理事件。 事件处理主循环 libevent的事件主循环主要是通过event_base_loop ()函数完成的,其主要操作如下面的流程图所示,event_base_loop所作的就是持续执行下面的循环。    上图的简单描述就是: 校正系统当

超越 5882

python实现边缘检测Canny算子 (附完整源码)

python实现边缘检测Canny算子 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 457

[libevent]集成信号处理和集成定时器事件

上文中提到了libevent中I/O事件和Signal以及Timer事件的集成,本文将分析如何将Signal集成到事件主循环的框架中。  集成策略——使用socket pair 上一文已经做了足够多的介绍了,基本方法就是采用“消息机制”。在libevent中这是通过socket pair完成的,下面就来详细分析一下。socket pair就是一个socket对,包含两个socket,一个读so

超越 1249

RAP BDL 里的 field ( readonly ) 到底控制了什么?——从语法到运行时的全景解析

RAP行为定义中的只读字段控制 摘要:该代码片段展示的是RAP(ABAP RESTful Application Programming)行为定义语言(BDL)中的字段控制语法,用于声明业务对象中需由框架自动维护的只读字段。field ( readonly )语句将订单ID和审计字段(CreatedBy/CreatedAt等)标记为只读,确保这些字段在更新阶段不可修改。在managed场景下,RAP框架会自动处理这些行政性数据的写入:创建时填充创建信息,更新时刷新变更记录,并利用LocalLastChang

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 157

如何正确理解和获取S参数

差分四端口的S参数是由双端口S参数逐步演化而来,因此,在数学中,其各分量均可以从单端S参数推导而来,在实际的仿真和测试中,软件和测量设备也是通过获取单端S参数矩阵再进行运算得到混合S参数矩阵的,并非直接获取。

一只豌豆象的博客 5153

libevent学习笔记九:libevent集成信号处理

libevent学习笔记九:libevent集成信号处理 现在我们已经了解了libevent的基本框架:事件管理框架和事件主循环。上节提到了libevent中I/O事件和Signal以及Timer事件的集成,这一节将分析如何将Signal集成到事件主循环的框架中。 1 ,集成策略——使用socket pair 前一节已经做了足够多的介绍了,基本方法就是采用“消息机制”。在libevent中这...

jyl_sh的专栏 1276

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

libevent源码深度剖析七

libevent源码深度剖析七——事件主循环张亮     现在我们已经初步了解了libevent的Reactor组件——event_base和事件管理框架,接下来就是libevent事件处理的中心部分——事件主循环,根据系统提供的事件多路分发机制执行事件循环,对已注册的就绪事件,调用注册事件的回调函数来处理事件。1 阶段性的胜利    Libevent将I/O事件、定时器和信号

sparkliang的专栏 3万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

libevent事件上的处理,定时事件、信号事件

目录回调函数参数说明事件状态事件创建函数事件的详解1.信号事件2.定时事件 回调函数参数说明 libevent的回调函数的格式就是三个参数 typedef void (*event_callback_fn)(evutil_socket_t, short, void *); 前两个参数不用我们传(目前我学的浅,只传递过第三个参数),第三个参数是一个通用的指针,可以选择传也可以选择不传 事件状态 EV_READ 可读 EV_WRITE 可写 EV_SIGNAL 信号事件 EV_PERSIST 永久性(很多事件默

dxgzg的博客 2277

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

libevent源码深度剖析八

libevent源码深度剖析八——集成信号处理张亮      现在我们已经了解了libevent的基本框架:事件管理框架和事件主循环。上节提到了libevent中I/O事件和Signal以及Timer事件的集成,这一节将分析如何将Signal集成到事件主循环的框架中。1 集成策略——使用socket pair      前一节已经做了足够多的介绍了,基本方法就是采用“消息机制”

sparkliang的专栏 2万+

libevent_信号集成

目录 1.集成策略 2.socket pair创建过程 3.Signal 事件的管理 4.注册、注销 signal 事件 1.集成策略 1) 当 Signal 发生时,并不立即调用 event 的 callback ()函数处理信号,而是设法通知系统的 I/O 机制,让其返回,然后再统一和 I/O 事件以及 Timer事件 一起处理。 2) 关键在于如何通知系统的I/O多路...

上道的程序员 272

libevent源码解析:信号事件(二)

libevent中对三类事件进行了封装,io事件、信号事件、定时器事件,libevent源码分析系列文章会分别分析这三类事件,本文分析信号事件。libevent框架将linux中的信号事件转换成io事件进行处理,从而将信号事件和io事件进行了有机的统一。

qq_36472340的博客 1428

libevent学习笔记七:libevent事件处理框架剖析

libevent学习笔记七:libevent事件处理框架剖析 前面几节已经对libevent的事件处理框架和event结构体做了描述和介绍,现在是需要进一步的深入剖析的时候了,更深入的对libevent事件的详细处理流程进行解析和理解,本节具体的将分析libevent的事件处理框架event_base和libevent注册、删除事件的流程,可结合前一节libevent对event的管理的流程进行...

jyl_sh的专栏 1266

Libevent--信号事件

对于信号事件的监听,比较不同的是,不是每一个信号有一个event,然后放进内核中去监听。而是对于所有信号,共用一个信号事件event去监听,当有信号来临时,使用管道将信号写进去,libevent通过这个event来监听这个管道,然后当这个管道有数据读的时候,这个event的回调函数就是遍历管道中的信号,然后分别将该信号的事件处理器添加到激活队列中。 ...

qq_41983709的博客 770

libevent源码深度剖析-张亮

一 序幕 1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少。写这一系列文章的用意在于,一则分享心得;二则对libevent代码和设计思想做系统的、更深层次的分析,写出来,也可供后来者参考。 附带一句:Libevent是用c语言编写的(MS大牛们都偏爱c语言哪),而且几乎是无处不函数指针,学习其源代码也需要相当的c语言基础。 2 Libevent简介 ...

xupeng1644的博客 6058

libevent(七)信号事件监听

libevent通过socketpair实现对信号事件的监听。 还记得event_base吗? struct event_base { struct evsig_info sig; // 略 }; evsig_info结构如下: struct evsig_info { evutil_socket_t ev_signal_pair[2]; /* ...

weixin_33805557的博客 318
上一篇: Libevent学习笔记二——事件管理
下一篇: libevent学习笔记五——socketpair
NMG_CJS
博客等级 码龄11年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值