• libevent库


    libevent介绍

    1 事件驱动, 高性能, 轻量级, 专注于网络
    2 源代码精炼, 易读
    3 跨平台
    4 支持多种I/O多路复用技术, 如epoll select poll等
    5 支持I/O和信号等事件

    libevent的核心实现:

    在linux上, 其实质就是epoll反应堆.
    libevent是事件驱动, epoll反应堆也是事件驱动, 当要监测的事件发生的时候, 就会调用事件对应的回调函数, 执行相应操作. 特别提醒: 事件回调函数是由用户开发的, 但是不是由用户显示去调用的, 而是由libevent去调用的.

    libevent的地基-event_base

    使用libevent 函数之前需要分配一个或者多个 event_base 结构体, 每个event_base结构体持有一个事件集合, 可以检测以确定哪个事件是激活的, event_base结构相当于epoll红黑树的树根节点, 每个event_base都有一种用于检测某种事件已经就绪的 “方法”(回调函数)
    通常情况下可以通过event_base_new函数获得event_base结构。
    下面介绍一些常用函数:
    相关函数说明:

    1 struct event_base *event_base_new(void);    //event.h的L:337
    
    • 1

    函数说明: 获得event_base结构
    参数说明: 无
    返回值:
    成功返回event_base结构体指针;
    失败返回NULL;

    2 void event_base_free(struct event_base *);   //event.h的L:561
    
    • 1
    函数说明: 释放event_base指针
    
    • 1
    3 int event_reinit(struct event_base *base);  //event.h的L:349
    
    • 1

    函数说明: 如果有子进程, 且子进程也要使用base, 则子进程需要对event_base重新初始化, 此时需要调用event_reinit函数.
    函数参数: 由event_base_new返回的执行event_base结构的指针
    返回值: 成功返回0, 失败返回-1

    对于不同系统而言, event_base就是调用不同的多路IO接口去判断事件是否已经被激活, 对于linux系统而言, 核心调用的就是epoll, 同时支持poll和select.

    查看libevent支持的后端的方法有哪些:

    const char **event_get_supported_methods(void);
    
    • 1

    函数说明: 获得当前系统(或者称为平台)支持的方法有哪些
    参数: 无
    返回值: 返回二维数组, 类似与main函数的第二个参数**argv.

    const char * event_base_get_method(const struct event_base *base);
    
    • 1

    函数说明: 获得当前base节点使用的多路io方法
    函数参数: event_base结构的base指针.
    返回值: 获得当前base节点使用的多路io方法的指针

    使用libevent库的步骤:

    1 创建根节点–event_base_new
    2 设置监听事件和数据可读可写的事件的回调函数
    设置了事件对应的回调函数以后, 当事件产生的时候会自动调用回调函数
    3 事件循环–event_base_dispatch
    相当于while(1), 在循环内部等待事件的发生, 若有事件发生则会触发事件对应的回调函数。
    4 释放根节点–event_base_free
    释放由event_base_new和event_new创建的资源, 分别调用event_base_free
    和event_free函数.

    事件驱动-event

    事件驱动实际上是libevent的核心思想, 本小节主要介绍基本的事件event。
    主要的状态转化:
    在这里插入图片描述

  • 相关阅读:
    Extended real number line
    CNN-generated images are surprisingly easy to spot... for now
    基于java+springboot+mybatis+vue+elementui的人职匹配推荐系统
    正点原子嵌入式linux驱动开发——Linux MISC驱动
    CCED,一个时代的落幕
    misc类设备驱动0——板载蜂鸣器驱动测试
    软件测试基础学习
    vue左侧漏斗切换 echart图表动态更新
    Java框架总结(高淇java300集+入门笔记)
    【毕业设计】深度学习 opencv python 实现中国交通标志识别
  • 原文地址:https://blog.csdn.net/qq_30505673/article/details/127955292