转自:https://blog.csdn.net/majianfei1023/article/details/46485705

欢迎转载,转载请注明原文地址: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

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

[mjf@localhost libevent-2.0.22-stable]$ ./configure --prefix=/home/mjf/lib  (prefix是我配置目录,默认可以不加)
[mjf@localhost libevent-2.0.22-stable]$ make
[mjf@localhost 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了。

[mjf@localhost libevent-2.0.22-stable]$ whereis libevent-2.0.so.5

[mjf@localhost ~]$ 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!"了。
---------------------
作者:majianfei1023
来源:CSDN
原文:https://blog.csdn.net/majianfei1023/article/details/46485705
版权声明:本文为博主原创文章,转载请附上博文链接!

libevent学习笔记 一、基础知识【转】的更多相关文章

  1. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

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

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  3. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  4. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  5. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

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

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  7. Docker的学习笔记(一)基础知识

    概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...

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

    正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...

  9. (C/C++学习笔记) 一. 基础知识

    一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...

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

    一:枚举的含义 枚举是用户定义的整数类型.在声明一个枚举时,要指定该枚举的示例可以包含的一组可接受的值.还可以给值指定易于记忆的名称.个人理解就是为一组整数值赋予意义. 二:枚举的优势 2.1:枚举可 ...

随机推荐

  1. tomcat插件使用

    1.pom.xml添加插件 <build> <plugins> <!-- tomcat7插件 --> <!-- 注意:目前来说,maven中央仓库还没有tom ...

  2. Dream team: Stacking for combining classifiers梦之队:组合分类器

     sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  3. Python 排序和numpy排序,得到排序后索引序列(及源list的序列)

    Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...

  4. Java 读取propertoes文件

    我一直不懂,Java里面的路径是咋样的,怎么找到我的资源文件? 直到我看到了这篇文件,写的是真棒.这篇文章  看完之后,豁然开朗的感觉 下面做些笔记,首先,Java有一个targer文件,下面有一个c ...

  5. JDBC-Transaction

    /** * 数据库中事务,指一组逻辑操作单元,使数据从一种状态变换到另一种状态 * 操作全部完成时,数据被保留,一致性可以保持,一部分操作失败时,整个操作全部视为错误,所有被操作数据回退到开始状态,放 ...

  6. HTML5 离线缓存Appcache

    创建一个和html同名的manifest文件,比如页面为index.html,那么可以建一个index.manifest的文件,然后给index.html的html标签添加如下属性即可: <ht ...

  7. ibatis项目启动报错The string "--" is not permitted within comments【原】

    该错误主要就是因为xml中<!-- [注释]--> 注释与-->之间没有空格造成xml解析错误 sqlMapConfig.xml内容如下 <?xml version=" ...

  8. java assert的用法简介【转】

    assert的基本用法 assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身.有的是通过库 ...

  9. Storm基本原理概念及基本使用

    1. 背景介绍 1.1 离线计算是什么 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示: 代表技术:Sqoop批量导入数据.HDFS批量存储数据.MapReduce批量计算数据.H ...

  10. threading.local学习

    多线程抢占问题 import time import threading obj = 5 def task(arg): global obj obj = arg time.sleep(1) print ...