一、初识

1、libevent介绍

Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。

2、安装

官网:libevent

我这里用的是2.1.8版本,linux使用的是ubuntu20.4。使用原码安装。

(1)解压
(2)./configure              # 检查安装环境 生成 makefile
(3)make                     # 生成 .o 和 可执行文件
(4)sudo make install        # 将必要的资源cp置系统指定目录。

3、检查是否安装成功

进入sample路径下

这里有一些小demo可以测试书否安装成功

这样即表示安装成功。

4、查看安装路径

头文件在include里面

5、框架相关的不常用函数

查看支持哪些多路io

/*************************************************************************> File Name: 01event.c> Author: Winter> Created Time: 2022年02月17日 星期四 20时58分11秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <event2/event.h>int main(int argc, char* argv[])
{struct event_base* base = event_base_new();               // 创建baseint i;const char** buff1;buff1 = event_get_supported_methods();       // 查看支持哪些多路iofor (i  = 0; i < 10; i++) {printf("buff1[i] = %s\n", buff1[i]);}return 0;
}

注意编译时,添加-levent

查看当前使用的多路IO

/*************************************************************************> File Name: 01event.c> Author: Winter> Created Time: 2022年02月17日 星期四 20时58分11秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <event2/event.h>int main(int argc, char* argv[])
{struct event_base* base = event_base_new();               // 创建basconst char *buff2;buff2 = event_base_get_method(base);                      // 查看当前使用的多路IOprintf("buff2 = %s\n", buff2);return 0;
}

二、libevent封装的框架思想

1、libevent框架

1. 创建 event_base     (乐高底座)
2. 创建 事件evnet
3. 将事件 添加到 base上
4. 循环监听事件满足
5. 释放 event_base

(1)创建 event_base       (乐高底座)

struct event_base *event_base_new(void);
struct event_base *base = event_base_new();

(2)创建 事件evnet

创建事件分为两种:常规事件(event_new)和带缓冲区的事件(bufferevent_socket_new)

常规事件            event    --> event_new();
带缓冲区的事件      bufferevent --> bufferevent_socket_new();

(3)将事件 添加到 base上

int event_add(struct event *ev, const struct timeval *tv)

(4)循环监听事件满足

int event_base_dispatch(struct event_base *base);

(5)释放 event_base

event_base_free(base);

2、使用fifo读写(常规事件)

创建事件event

struct event *event_new(struct event_base *base,evutil_socket_t fd,short what event_callback_fn cb;  void *arg);参数:base: event_base_new()返回值fd: 绑定到 event 上的 文件描述符what:对应的事件(r、w、e)EV_READ       一次 读事件EV_WRTIE  一次 写事件EV_PERSIST    持续触发。 结合 event_base_dispatch 函数使用,生效。cb:一旦事件满足监听条件,回调的函数。typedef void (*event_callback_fn)(evutil_socket_t fd,  short,  void *)    arg: 回调的函数的参数。返回值:成功创建的 event

读操作

/*************************************************************************> File Name: myread.c> Author: Winter> Created Time: 2022年02月18日 星期五 21时07分03秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <event2/event.h>// 回调函数
void read_cb(evutil_socket_t fd, short what, void* arg) {// 读管道char buff[1024] = {0};int len = read(fd, buff, sizeof(buff));printf("read event : %s \n", what & EV_READ ? "YES" : "NO");printf("data len = %d, buff = %s\n", len, buff);sleep(1);
}int main(int argc, char* argv[])
{unlink("myfifo");// 创建有名fifoint res = mkfifo("myfifo", 0664);if (res == -1) {perror("mkfifo error\n");exit(1);}// 打开fifoint fd = open("myfifo", O_RDONLY | O_NONBLOCK);        // 非阻塞只读if (fd == -1) {perror("open error\n");exit(1);}// 创建event_basestruct event_base* base = event_base_new();// 创建事件     EV_PERSIST是持续读struct event* ev = event_new(base, fd, EV_READ | EV_PERSIST, read_cb, NULL);// struct event* ev = event_new(base, fd, EV_READ, read_cb, NULL);// 添加事件event_add(ev, NULL);// 事件循环event_base_dispatch(base);               // while (1) {  epoll }// 释放资源event_free(ev);event_base_free(base);close(fd);return 0;
}

写操作

/*************************************************************************> File Name: mywrite.c> Author: Winter> Created Time: 2022年02月18日 星期五 21时24分04秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <event2/event.h>
#include <fcntl.h>// 回调函数
void write_cb(evutil_socket_t fd, short what, void* arg) {// 写管道char buff[1024] = {0};static int num = 0;sprintf(buff, "hello world - %d", num++);write(fd, buff, strlen(buff) + 1);sleep(1);
}int main(int argc, char* argv[])
{// 与myread.c配套,但是要先打开myread程序// 打开管道int fd = open("myfifo", O_WRONLY | O_NONBLOCK);if (fd == -1) {perror("open error\n");exit(1);}// 创建event_basestruct event_base* base = event_base_new();// 创建写事件   EV_PERSIST是持续写struct event* ev = event_new(base, fd, EV_WRITE | EV_PERSIST, write_cb, NULL);// struct event* ev = event_new(base, fd, EV_WRITE, write_cb, NULL);// 添加事件event_add(ev, NULL);// 事件循环event_base_dispatch(base);// 释放资源event_free(ev);event_base_free(base);close(fd);return 0;
}

测试

这里只测试了带有EV_PERSIST参数的event_new函数。

libevent库学习(1)相关推荐

  1. 【libevent】libevent库学习总结(一)——基础

    libevent库学习总结(一)--基础 一.基础 1.1. 介绍 Libevent是一个用于开发可伸缩网络服务器的事件通知库.Libevent API提供了一种机制来执行回调函数,当某个特定事件发生 ...

  2. 【libevent】libevent库学习总结(二)——编程步骤

    一.libevent编程步骤 0.分配并初始化event_base,两种方法 0.1 event_base_new:线程安全,代替event_init: 0.2 event_init:线程不安全,不推 ...

  3. Libevent库的学习

    目录 Libevent 概述 Libevent 使用模型 使用Libevent的基本流程: libevent 的核心,event 事件 1. 创建一个事件event 2. 释放event_free 3 ...

  4. muduo网络库学习(七)用于创建服务器的类TcpServer

    目前为止,涉及到的绝大多数操作都没有提及线程,EventLoop,Poller,Channel,Acceptor,TcpConnection,这些对象的执行都是在单独线程完成,并没有设计多线程的创建销 ...

  5. Linux动态库的下载与配置(以libevent库为例)

    ** Linux动态库的下载与配置 ** 本章以下载.安装.配置libevent库为例(安装libevent的前提是已经成功安装openssl库) 一.libevent的下载 https://libe ...

  6. libevent库介绍

    libevent库 1.安装 https://gitee.com/craboy1/libraries/blob/master/libgevent/libgevent.c libevent库介绍 htt ...

  7. libevent库的安装与使用

    一.libevent库的安装 Libevent 使用源码安装的方式,源码下载地址:http://libevent.org/ 下载下来后,将 Libevent 的压缩包拷贝到 Linux 系统中,然后按 ...

  8. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  9. POCO C++库学习和分析

    POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...

最新文章

  1. Qt 4.3 公布揭晓
  2. 使用多窗体时, 关于节约内存和加快启动速度的思考与尝试
  3. CobarClient源码分析
  4. 初识Docker-Docker的安装
  5. 为什么我开发的SAP UI5应用里的group by 功能不工作?
  6. python中head_python学习笔记[headfirst]
  7. 解读netty3.9的数据处理流程(一)
  8. 《Spring 5 官方文档》5. 验证、数据绑定和类型转换(二)
  9. 建议推出专门用于开发的电脑
  10. 转载--认识迅雷界面引擎
  11. python中的scaler_【笔记】scikit-learn中的Scaler(归一化)
  12. 谈谈登录注册的如何实现
  13. 今日头条如何快速开通原创
  14. 绿色明珠--野三坡白草畔
  15. xray扫描器的使用 (长亭科技公司创造)
  16. java htmlunit
  17. 项目目录游戏服务器,Yivgame是一个基于go-kit的微服务游戏服务器
  18. Opencv Mat矩阵操作
  19. 为什么中国程序员不如外国程序员有创造性?
  20. js判断是否在微信浏览器中打开网页

热门文章

  1. QT 语言家 中英文切换
  2. html+css网页练习一
  3. 02-RVNC 服务端部署教程
  4. SharePoint学习总结
  5. 周末老板请吃东西,刮到多少算多少?Python带你制作一款刮刮卡小程序。
  6. kail linux dns欺骗,Kali Linux渗透测试-Ettercap DNS欺骗攻击-Go语言中文社区
  7. Rime Squirrel 鼠须管输入法配置详解
  8. 怎样成为快速阅读的高手(中)
  9. Java第五章——面向对象(二)
  10. linux AT T Assembly