libevent学习笔记 一、基础知识

欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46485705

一、libevent是什么

libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。

它被众多的开源项目使用,例如大名鼎鼎的memcached等。

特点:

事件驱动,高性能;

轻量级,专注于网络(相对于ACE);

开放源码,代码相当精炼、易读;

跨平台,支持Windows、Linux、BSD和Mac OS;

支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务;

支持I/O,定时器和信号等事件;

采用Reactor模式;

二、下载

libevent1.4代码量比较少,结构比较简单,也适合入门学习,1.4很早以前看过了,大家想学习也可以学习1.4。

这里学习的是libevent2.0以上版本。代码量也比1.4高很多,也加了很多功能。

libevent下载:http://libevent.org/

我下载的是
libevent-2.0.22-stable.tar.gz

下载之后解压,然后进入目录就可以安装了。

[[email protected] libevent-2.0.22-stable]$ ./configure --prefix=/home/mjf/lib  (prefix是我配置目录,默认可以不加)

[[email protected] libevent-2.0.22-stable]$ make

[[email protected] libevent-2.0.22-stable]$ sudo make install

注:./configure --prefix=/home/mjf/lib 因为如果我不加prefix,后面执行示例程序的时候会如下错误:error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory, 所以我自己定制了路径,就没问题了,当然你的可能没问题,那就不用加,install之后直接在/usr/lib或者/usr/local/lib里面就能看到了libevent*.so了。

[[email protected] libevent-2.0.22-stable]$ whereis libevent-2.0.so.5

[[email protected] ~]$ ls -al /usr/lib | grep libevent

lrwxrwxrwx.  1 root root      21 Jun 13 22:15 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9

-rwxr-xr-x.  1 root root  971951 Jun 13 22:15 libevent-2.0.so.5.1.9

-rw-r--r--.  1 root root 1575744 Jun 13 22:15 libevent.a

lrwxrwxrwx.  1 root root      26 Jun 13 22:15 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9

-rwxr-xr-x.  1 root root  588276 Jun 13 22:15 libevent_core-2.0.so.5.1.9

-rw-r--r--.  1 root root  982040 Jun 13 22:15 libevent_core.a

-rwxr-xr-x.  1 root root     970 Jun 13 22:15 libevent_core.la

lrwxrwxrwx.  1 root root      26 Jun 13 22:15 libevent_core.so -> libevent_core-2.0.so.5.1.9

lrwxrwxrwx.  1 root root      27 Jun 13 22:15 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9

-rwxr-xr-x.  1 root root  405038 Jun 13 22:15 libevent_extra-2.0.so.5.1.9

-rw-r--r--.  1 root root  593776 Jun 13 22:15 libevent_extra.a

-rwxr-xr-x.  1 root root     977 Jun 13 22:15 libevent_extra.la

lrwxrwxrwx.  1 root root      27 Jun 13 22:15 libevent_extra.so -> libevent_extra-2.0.so.5.1.9

-rwxr-xr-x.  1 root root     935 Jun 13 22:15 libevent.la

lrwxrwxrwx.  1 root root      30 Jun 13 22:15 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9

-rwxr-xr-x.  1 root root   18446 Jun 13 22:15 libevent_pthreads-2.0.so.5.1.9

-rw-r--r--.  1 root root   18686 Jun 13 22:15 libevent_pthreads.a

-rwxr-xr-x.  1 root root     998 Jun 13 22:15 libevent_pthreads.la

lrwxrwxrwx.  1 root root      30 Jun 13 22:15 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9

lrwxrwxrwx.  1 root root      21 Jun 13 22:15 libevent.so -> libevent-2.0.so.5.1.9

我们可以看到有以下一些库。

libevent_core:所有核心的事件和缓冲功能,包含了所有的event_base、evbuffer、bufferevent和工具函数。

libevent_extra:定义了程序可能需要,也可能不需要的协议特定功能,包括HTTP、DNS和RPC。

libevent:这个库因为历史原因而存在,它包含libevent_core和libevent_extra的内容。不应该使用这个库,未来版本的libevent可能去掉这个库。

libevent_pthreads:添加基于pthread可移植线程库的线程和锁定实现。它独立于libevent_core,这样程序使用libevent时就不需要链接到pthread,除非是以多线程方式使用libevent。

三、libevent的功能。

Libevent提供了事件通知,io缓存事件,定时器,超时,异步解析dns,事件驱动的http server以及一个rpc框架。

事件通知:当文件描述符可读可写时将执行回调函数。

Io缓存:缓存事件提供了输入输出缓存,能自动的读入和写入,用户不必直接操作io。

定时器:libevent提供了定时器的机制,能够在一定的时间间隔之后调用回调函数。

信号:触发信号,执行回调。

异步的dns解析:libevent提供了异步解析dns服务器的dns解析函数集。

事件驱动的http服务器:libevent提供了一个简单的,可集成到应用程序中的HTTP服务器。

RPC客户端服务器框架:libevent为创建RPC服务器和客户端创建了一个RPC框架,能自动的封装和解封数据结构。

四、Reactor(反应器)模式

libevent是一个典型的reactor模式的实现。这里做一下简单介绍:

我们知道,普通的函数调用机制如下:程序调用某个函数,函数执行,程序等待,函数将结果返回给调用程序(如果含有函数返回值的话),也就是顺序执行的。

而Reactor模式的基本流程如下:应用程序需要提供相应的接口并且注册到reactor反应器上,如果相应的事件发生的话,那么reactor将自动调用相应的注册的接口函数(类似于回调函数)通知你,所以libevent是事件触发的网络库。

四、编译运行一个小例子

#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <event.h>
// 定时事件回调函数
void onTime(int sock, short event, void *arg)
{
    printf("Hello,World!\n");

    struct timeval tv;
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    // 重新添加定时事件(定时事件触发后默认自动删除)
    event_add((struct event*)arg, &tv);
} 

int main()
{
    // 初始化
    event_init(); 

    struct event ev_time;
    // 设置定时事件
    evtimer_set(&ev_time, onTime, &ev_time); 

    struct timeval tv;
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    // 添加定时事件
    event_add(&ev_time, &tv); 

    // 事件循环
    event_dispatch(); 

    return 0;
}

gcc example1.c -o example1 -levent

大功告成,就可以在终端看到每隔两秒输出"Hello,World!"了。

时间: 2024-08-26 09:17:23

libevent学习笔记 一、基础知识的相关文章

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法? 二:值类型转换为引用类型--装箱 2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址.这个地址就是一个指向对象的引用. int i = 10; Object obj = i; 三:将引用类型转换为值

[Golong]学习笔记(一) 基础知识

Go编程基础 Go的内置关键字(25个) 不多 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continute for import return var Go的注释方法(和js一样) 单行注释: // 多行注释: /**/ Go程序一般结构 common_structure.go 通过 pack

.net学习笔记---xml基础知识

一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基础: <?xml version="1.0" encoding="utf-8" ?> <books ISBN="9787544238212"> <title>xml学习笔记</title> <pr

C#学习笔记(基础知识回顾)之枚举

一:枚举的含义 枚举是用户定义的整数类型.在声明一个枚举时,要指定该枚举的示例可以包含的一组可接受的值.还可以给值指定易于记忆的名称.个人理解就是为一组整数值赋予意义. 二:枚举的优势 2.1:枚举可以使代码更易于维护,有助于确保给变量指定合法的.期望的值. 2.2:枚举可以使代码清晰,用描述性的名称来表示整数值,增加代码可读性. 三:枚举的使用 /// <summary> /// 声明一个枚举,审核状态 /// </summary> public enum AduitStatus

[算法学习笔记]算法基础知识

算法基础知识 算法的五大要素 有穷性:算法必须能够在有限个步骤内完成. 确定性:算法的每一步必须有确定的定义. 输入 输出 可行性:算法的每个步骤都必须能分解为基本的可执行操作,每个步骤都必须能在有限时间内完成 循环不变式 循环中的循环不变式可以帮助我们理解算法的正确性.为了证明算法的正确,必须证明循环不变式的三个性质: 1. 初始化:循环不变式在循环开始之前是正确的. 2. 保持:循环不变式在循环的每一次迭代开始之前是正确的. 3. 终止:在循环结束时,不变式会给出一个可以对判断算法是否正确有

《汇编语言》学习笔记1——基础知识

第一章   基础知识 汇编语言的组成 汇编指令:机器码的助记符,有对应的机器码(汇编语言的核心) 伪指令:没有对应的机器码,由编译器执行,计算机并不执行 其他符号:如:+.-.*./等,由编译器识别,没有对应的机器码 指令和数据都是应用上的概念,在内存或磁盘上指令和数据都是二进制信息. 存储器被划分为若干个存储单元,每个存储单元从0开始. 一个存储器有128个存储单元,一个存储单元存储一个字节,一个字节有8个二进制位. 内存换算: 1bit=8byte(B).1KB=1024B.1MB=1024

Scala学习笔记--正则表达式基础知识、如何在scala内使用

正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www.jb51.net/tools/zhengze.html  版本:v2.33 (2013-1-10) 作者:deerchao 转载请注明来源 使用格式:  见java API  http://docs.oracle.com/javase/7/docs/api/ java : java.util.reg

汇编学习笔记---(2)基础知识

今天,接着上次,继续学习汇编语言,主要对内存地址空间.主板.接卡口.存储芯片等进行了解. 什么是内存地址空间? 要搞清楚这个问题,我们首先要知道主板和接口卡. 每个PC都会有一个主板,主板上附有核心器件,包括CPU.存储器.外围芯片组.扩展插槽等,它们通过地址总线+数据总线+控制总线相连. 接口卡啥作用,说白了就是通过总线接收CPU发送的命令,对显示器.音响等外部设备进行控制. 一台PC中主要有两种存储器:随机存储器RAM和只读存储器ROM. RAM中用于存放CPU使用的绝大部分程序和数据,PC

R语言学习笔记:基础知识

1.数据分析金字塔 2.[文件]-[改变工作目录] 3.[程序包]-[设定CRAN镜像] [程序包]-[安装程序包] 4.向量 c() 例:x=c(2,5,8,3,5,9) 例:x=c(1:100) 表示把1 - 100的所有数字都给x这个变量 5.查看x的类型:>mode(x) 6.查看x的长度:>length(x) 7.将两个向量组成一个矩阵: >rbind(x1, x2)  注:r是row的意思,即行,按行组成矩阵. >cbind(x1, x2)  注c是column的意思,

python3基础学习笔记(基础知识)-01

python的基础学习: 数据类型:python是弱类型语言,在定义变量的时候,可以不直接制定数据类型. 1.Numbers: int 有符号整型    a = (-1)  a = 1 long 长整型 float 浮点型 complex 复数 2.boolean: True    Flase 3.String :字符串   a = "Hello World" 4.List :列表 有序  list1 = [] 5.Tuple : 元组  定义后不能被修改  a = (1,2,3) 6