libevent学习笔记 一、基础知识

一、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是事件触发的网络库。

四、编译运行一个小例子
[cpp] view plain copy
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <sys/time.h>  
  4. #include <event.h>  
  5. // 定时事件回调函数   
  6. void onTime(int sock, short event, void *arg)   
  7. {   
  8.     printf("Hello,World!\n");  
  9.   
  10.     struct timeval tv;   
  11.     tv.tv_sec = 1;   
  12.     tv.tv_usec = 0;   
  13.     // 重新添加定时事件(定时事件触发后默认自动删除)   
  14.     event_add((struct event*)arg, &tv);   
  15. }   
  16.      
  17. int main()   
  18. {   
  19.     // 初始化   
  20.     event_init();   
  21.      
  22.     struct event ev_time;   
  23.     // 设置定时事件   
  24.     evtimer_set(&ev_time, onTime, &ev_time);   
  25.      
  26.     struct timeval tv;   
  27.     tv.tv_sec = 1;   
  28.     tv.tv_usec = 0;   
  29.     // 添加定时事件   
  30.     event_add(&ev_time, &tv);   
  31.      
  32.     // 事件循环   
  33.     event_dispatch();   
  34.      
  35.     return 0;   
  36. }  

gcc example1.c -o example1 -levent

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汉字逆置

在计算机中&#xff0c;一个汉字用无法用1个字节来表示 #include<stdio.h> int main() {char buf[256] "你好";int len 0;while(buf[len]);len--;printf("%d\n",len);// 4一个汉字两个字节 //printf("%p\n",buf);return 0; } 在windows下…

libevent项目分析(一) -- 准备阶段

项目的简介 我理解libevent是一个轻量级的&#xff0c;跨平台高效的&#xff08;C语言实现&#xff09;事件驱动库&#xff0c;类似于ACE项目中的ACE_Reactor&#xff0c;它实现了网络通讯套接口I/O事件&#xff0c;定时器事件&#xff0c;信号事件的监听和事件处理函数回调机制…

混合字符串字符数统计

因为汉字占一个以上字节&#xff0c;如何统计一个既有汉字又有字母的字符串呢&#xff1f; 汉字在计算机中的ASCII是以负数来与其他普通字符的ASCII区分的。 #include<stdio.h> int main() {char buf[256] "你好世界";printf("%d\n",buf[0]); //-60…

清除字符串空格

1.清除字符串中右边的空格 从字符串尾部开始&#xff0c;找到非空格处&#xff0c;将下一个字符置为0即可。 //清除右边空格 #include<stdio.h> int main() {char buf[] "hello world ";int len 0;//calculate the length of stringwhile(buf[len]);le…

浅谈auto_ptr智能指针

引入智能指针&#xff1a;智能指针的实现原理&#xff1a; 资源分配即初始化RAII(Resource Acquisition Is Initialization)&#xff1a; 定义一个类来封装资源的分配和释放&#xff0c;在构造函数完成资源的分配和初始化&#xff0c;在析构函数完成资源的清理&#xff0c;可…

随机数

随机数产生器rand(),头文件为#include<stdlib.h> #include<stdio.h> #include<stdlib.h>int main() {int value;int i;for(i 0; i < 10; i){value rand();printf("value %d\n",value);}return 0; } 运行结果&#xff1a; value 41 value 1…

多重继承之虚继承(主要是为了解决产生的数据冗余问题)

虚继承 是面向对象编程中的一种技术&#xff0c;是指一个指定的基类&#xff0c;在继承体系结构中&#xff0c;将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。形式&#xff1a;在继承定义中包含了virtual关键字的继承关系&#xff0c;如下图中&#xff0c;类A就…

通过syslog接收远程日志

通过syslog接收远程日志通过syslog接收远程主机的日志&#xff0c;需要做一些环境配置。客户机A通过syslog将日志信息发送到服务主机B&#xff08;或称日志采集服务器&#xff09;。以下说明配置过程&#xff08;我的实验环境是&#xff0c;客户机A&#xff1a;Solaris 10&…

linux syslog服务器配置,自动发日志到另一台日志服务器

1.客户端:168.1.20.66修改/etc/syslog.conf 添加syslog.info 168.1.80.302.日志服务器:168.1.80.30修改/etc/sysconf/syslog 修改SYSLOGD_OPTIONS为 "-r -x -m 0" #-r表示允许接收外来的消息&#xff0c;-x表示不解析DNS, #-m 0表示时间戳标记间隔,如果指定只接…

Make文件(一)

基本规则&#xff1a; 目标&#xff1a;依赖 &#xff08;tab&#xff09;规则 目标&#xff1a;需要生成的目标文件 依赖&#xff1a;生成该目标所需的一些文件 规则&#xff1a;由依赖文件生成目标文件的手段 tab&#xff1a;每条规则前必须以tab开头&#xff0c;使用空格不行…

移植驱动完毕后加载时的version magic报错原因以及解决办法

History:2012-02-17Author:yingru移植rt3070的AP驱动到装有fedora14的PC机上时&#xff0c;模块编译完毕后&#xff0c;加载时提示invalid module format。PC机环境介绍&#xff1a;内核版本&#xff1a;2.6.35.6-45.fc14.i686命令行输入dmesg查看最后的日志&#xff0c;发现如…

/proc 虚拟文件系统(实例)

Linux下有一个神奇的目录/proc&#xff0c;经常会运行 cat /proc/cpuinfo 命令查看cpu信息&#xff0c;/proc下的确有cpuinfo文件&#xff0c;但是这个文件不是物理存在的&#xff0c;是软件虚拟出来的&#xff0c;与普通文件不同&#xff0c;该文件是动态的。通过/proc可以实现…

内核模块中对文件的读写

平时网络部分的东西碰的多些&#xff0c;这块一开始还真不知道怎么写&#xff0c;因为肯定和在用户空间下是不同的。google过后&#xff0c;得到以下答案。一般可以用两种方法&#xff1a;第一种是用系统调用。第二种方法是filp->open()等函数。下面分别来说下这两种方法。1…

Makefile文件试错

1成功&#xff1a; src $(wildcard ./*cpp) obj $(patsubst %.cpp,%.o ,$(src))target test$(target) : $(obj)g $(obj) -o $(target) -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient %.o: %.cppg -c $< -o $ -I/usr/include/mysql -L/usr/lib/mysql/ -lmysql…

内核定时器timer_list使用

Linux内核中提供了timer使用的API&#xff0c;做一个简单的记要。 1. 包含的头文件&#xff1a;linux/timer.h 2. 数据类型&#xff1a;struct timer_list; 包含的主要成员&#xff1a; a. data:传递到超时处理函数的参数&#xff0c;主要在多个定时器同时使用时&#xff0c;区…

内存四区

1.代码区&#xff1a; 代码区Code&#xff0c;程序被操作系统加载到内存的时候&#xff0c;所有的可执行代码都加载到代码区&#xff0c;也叫代码段&#xff0c;这块内存是不可以在运行期间修改的。 2. 静态区 所有的全局变量以及程序中的静态变量都存储在静态区。 #include<…

最高效的进(线)程间通信机制--eventfd

我们常用的进程&#xff08;线程&#xff09;间通信机制有管道&#xff0c;信号&#xff0c;消息队列&#xff0c;信号量&#xff0c;共享内存&#xff0c;socket等等&#xff0c;其中主要作为进程&#xff08;线程&#xff09;间通知/等待的有管道pipe和socketpair。线程还有特…

malloc,calloc,realloc

与堆操作相关的两个函数 malloc #include<stdio.h> #include<stdlib.h> #include<string.h>int main() {char *p malloc(10); //内存随机&#xff0c;未做处理int i;for(i 0; i < 10: i){printf(“%d “,p[i]);} free(p);return 0; } 运行结果&…

Linux内核同步机制之completion

内核编程中常见的一种模式是&#xff0c;在当前线程之外初始化某个活动&#xff0c;然后等待该活动的结束。这个活动可能是&#xff0c;创建一个新的内核线程或者新的用户空间进程、对一个已有进程的某个请求&#xff0c;或者某种类型的硬件动作&#xff0c;等等。在这种情况下…

可变参数函数(一)

一个函数可以接受不定数的参数个数&#xff0c;这就是可变参数函数&#xff0c;比较常见的比如printf(),scanf()&#xff1b; printf(const char* format,…); printf(“%d”,i); printf(“%s”,s); printf(“the number is %d,stirng is :%s”,i,s); 变量参数函数的简单实现&a…