libevent源码学习(三)信号evsignal

本文深入探讨libevent如何处理信号事件,通过strace工具揭示其内部机制。libevent使用socketpair实现信号集成,当信号触发时,通过sendto发送消息使事件可读。文章详细介绍了libevent的信号接口、socketpair、集成策略,包括创建socketpair、通知event_base、初始化和信号处理函数的实现。通过对关键函数和结构体的分析,展示了libevent信号处理的完整流程。
摘要由CSDN通过智能技术生成

libevent的信号处理

libevent如何做signal的集成其实很简单,使用strace工具就可以很容易知道:

比如,用alarm产生一个定时器信号,然后使用libeventsigal的接口对其进行捕获,最终进入回调函数

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <unistd.h>
#include <signal.h>

#include <event2/event.h>
#include <event2/bufferevent.h>

void sig_cb(evutil_socket_t fd,short event,void *arg)
{
    printf("In signal event callback\r\n");
    struct event_base * base = (struct event_base *)arg;
    event_base_loopbreak(base);

}

int main(int argc,char **argv)
{
    struct event_base* base=event_base_new();
    assert(base!=NULL);
    struct event* ev=evsignal_new(base,
        (evutil_socket_t)SIGALRM,
        sig_cb,
        base);
    evsignal_add(ev,NULL);//在event_add函数中,通过ev->base获取event_base对象
    alarm(5);
    event_base_dispatch(base);
    printf("exit...\r\n");
    return 0;
}

strace ./alarm 发现会创建socketpair:

socketpair(PF_LOCAL, SOCK_STREAM, 0, [4, 5]) = 0

当信号发生时,会sendto一个消息,从而使得fd可读,epoll返回:

sendto(4, "\16", 1, 0, NULL, 0)         = 1
rt_sigreturn()                          = -1 EINTR (Interrupted system call)
epoll_wait(3, {
  {EPOLLIN, {u32=5, u64=5}}}, 32, -1) = 1
recvfrom(5, "\16", 1024, 0, NULL, NULL) = 1<
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值