Linux-计算机网络-Libevent入门

1.libevent概述

libevent是一个开源的轻量级的IO框架库,它底层封装了select,poll,epoll三种方法,为用户提供了一个便于使用的接口

2.libevent特点

(1)跨平台支持。 Libevent 支持 Linux、 Unix 和 Windows.

(2)统一事件源。 Libevent 对 I/0 事件、信号和定时事件提供统一的处理。

(3)线程安全。 Libevent 使用 libevent pthreads 库来提供线程安全支持。

(4)基于 Reactor 模式的实现。

简单来讲,就是主线程只负责事件的一个检测,主要看有没有产生事件,然后由工作线程对具体的事

件进行处理;

3.libevent安装

可以进行源码安装,但是那么源码安装就有可能会出现多个error,需要百度安装多个库,每个学生的系统的版本可能不同,依赖的库也有可能是不同的,那么缺什么库下载什么库就可以了;(平台的原因)所以这里只讲述Ubun下的安装

(1)sudo apt install libevent-2.1-7(后面是版本号)
(2)sudo apt install libevent-dev(安装有关开发的库)

(3)检验是否安装成功:

Is -al /usr/lib |grep libevent(看看是否安装成功,或者ls /usr/liblgrep event find /-name event

或者这样查找:

Is -al /usr/include grep event

4.libevent示例

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<event.h>
#include<assert.h>

void signal_cb(int fd,short event,void *argc)
{
    
    
         printf("sig=%d\n",fd);

    

}

void timeout_cb(int fd,short event,void *argc)
{
  
    printf("time out\n");
    
}

int main()
{
    struct event_base *base=event_init();
    assert(base!=NULL);

    struct event *sig_ev=evsignal_new(base,SIGINT,signal_cb,NULL);
    //struct event *sig_ev=event_new(base,SIGINT,EV_SIGNAL|EV_PERSIST,signal_cb,NULL);
    assert(sig_ev!=NULL);
    event_add(sig_ev,NULL);

     struct event *timeout_ev=evtimer_new(base,timeout_cb,NULL);
    //struct event* timeout_ev=event_new(base,-1,EV_TIMEOUT|EV_PERSIST,timeout_cb,NULL);
    struct timeval tv={3,0};

    event_add(timeout_ev,&tv);

    event_base_dispatch(base);

    event_free(sig_ev);
    event_free(timeout_ev);
    event_base_free(base);
    
    exit(0);
}

5.libevent使用模型,事件类型及框架结构

(1)libevent使用模型

(2)libevent支持的事件类型

Libevent 支持的事件类型 :有定时事件有读事件,写事件,信号事件,永久事件,当IO方法支持ET模式

时,Libevent也可以使用ET模式:

(3)libevent的框架结构

没有设置永久事件,那么只响应一次,以后就不再响应了,
设置了永久事件,底层的I0复用方法会反复检测,而不是只检测一次,当然也就不会只响应一次了;

6.事件类型的应用

引自高性能服务器编程239页:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<event.h>
#include<assert.h>

//回调函数改为
void signal_cb(int fd,short event,void *argc)
{
    if(event & EV_SIGNAL)
    {
         printf("sig=%d\n",fd);

    }

}

void timeout_cb(int fd,short event,void *argc)
{
    if(event & EV_TIMEOUT)
    {
    printf("time out\n");
    }
}

int main()
{
    struct event_base *base=event_init();
    assert(base!=NULL);

    //struct event *sig_ev=evsignal_new(base,SIGINT,signal_cb,NULL);改为:
    struct event *sig_ev=event_new(base,SIGINT,EV_SIGNAL|EV_PERSIST,signal_cb,NULL);
    
    assert(sig_ev!=NULL);
    event_add(sig_ev,NULL);

    // struct event *timeout_ev=evtimer_new(base,timeout_cb,NULL);改为:
     struct event* timeout_ev=event_new(base,-1,EV_TIMEOUT|EV_PERSIST,timeout_cb,NULL);
    
    struct timeval tv={3,0};

    event_add(timeout_ev,&tv);

    event_base_dispatch(base);

    event_free(sig_ev);
    event_free(timeout_ev);
    event_base_free(base);
    
    exit(0);
}
相关推荐
网硕互联的小客服8 分钟前
408 Request Timeout:请求超时,服务器等待客户端发送请求的时间过长。
运维·服务器
王伯安呢10 分钟前
告别线缆束缚!AirDroid Cast 多端投屏,让分享更自由
运维·服务器·教程·投屏·airdroid cast·多端互投
逍遥浪子~14 分钟前
搭建本地gitea服务器
运维·服务器·gitea
骄傲的心别枯萎17 分钟前
RV1126 NO.16:通过多线程同时获取H264和H265码流
linux·c++·音视频·rv1126
空灵之海18 分钟前
Ubuntu系统安全合规配置
linux·ubuntu·系统安全·1024程序员节
喜欢你,还有大家22 分钟前
FTP文件传输服务
linux·运维·服务器·前端
凯尔萨厮34 分钟前
Java学习笔记三(封装)
java·笔记·学习
czhc11400756631 小时前
LINUX99 centos8:网络 yum配置;shell:while [ $i -ne 5 ];do let i++ done
linux
胡耀超1 小时前
3.Python高级数据结构与文本处理
服务器·数据结构·人工智能·windows·python·大模型
YoungUpUp1 小时前
【文件快速搜索神器Everything】实用工具强推——文件快速搜索神器Everything详细图文下载安装教程 办公学习必备软件
学习·everything·文件搜索·实用办公软件·everything 工具·文件快速搜索·搜索神器