先摘一点网上的介绍

libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨平台,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。

接着我们先直接看一个例子,该例子每隔几秒输出一个句子

#include <iostream>
#include <event.h>
#include <ctime> using namespace std; void cb(evutil_socket_t fd, short what, void *arg)
{
cout<<"event ocurrence every 2 seconds."<<endl;
} int main()
{
timeval two_sec = {, };
event_base *base = event_base_new();
event *timeout = event_new(base, -, EV_PERSIST|EV_TIMEOUT, cb, NULL);
event_add(timeout, &two_sec);
event_base_dispatch(base);
return ;
}

event_base是libevent中的基本数据结构,该结构进行事件的调度,这里用event_config_new (void)函数new了一个event_base变量。event结构libevent里另外一个重要的数据结构,它保存着有关事件发生的各种信息,比如io事件的文件描述符,发生时调用的回调函数等。本例中我们定义了一个定时器事件,使用event_new (event_base *, evutil_socket_t, short, event_callback_fn, void *)创建了一个定时器事件,该函数第一个参数为调度该事件的event_base结构;第二个参数为io事件对应的文件描述符,这里为定时器事件没有fd所以定位-1,如果要定义signal事件,该参数就是信号的标志;第三个参数为事件event flags,可以以下几个及其合并EV_READ(io),EV_WRITE(io),EV_SIGNAL(信号),EV_PERSIST(存在该标志则事件发生后event_base将其重新添加到pending中),EV_ET, EV_TIMEOUT,根据程序要求选用EV_PERSIST|EV_TIMEOUT,就是重复定时。libevent中的事件有几种状态:no-pend&no-active,pending,active;刚刚建立的event为第一种状态,使用event_add(event*, time_val)将其变成pending状态,这样event_base进行事件调度时才会执行该事件,该函数第二参数为timeout时间,这里取2s。最后将进行event_base事件循环,event_base_dispatch。

使用libevent进行网络编程的话大概也就是这个流程。

Libevent 定时器的更多相关文章

  1. libevent 定时器示例

    程序执行结果: 每隔2秒,触发一次定时器. (2)98行:evtimer_assign在event.h中定义如下: 再来看看event_assign函数: ev     要初始化的事件对象 base  ...

  2. libevent 定时器timer

    libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库. 总体来说,libevent有下面一些特点和优势:* 事件驱动,高性能:* 轻量级,专注于网络: * 跨平 ...

  3. libevent中定时器的使用方法

    #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <signal.h ...

  4. libevent(一)定时器Demo

    开始研究libevent,使用的版本是2.0.22. 实现一个定时器:每2秒执行一次printf. #include <stdio.h> #include <stdlib.h> ...

  5. 定时器管理:nginx的红黑树和libevent的堆

    libevent 发生超时后, while循环一次从堆顶del timer——直到最新调整的最小堆顶不是超时事件为止,(实际是del event),但是会稍后把这个timeout的 event放到ac ...

  6. 利用libevent的timer实现定时器interval

    在不怎么了解libevent的情况下,看到timer这个关键字想到可以用来做定时任务,官方资料也不齐全,就从代码里看到了TIMEOUT字样,这么说来应该是支持timeout了,那interval呢,貌 ...

  7. libevent::事件::定时器2

    #define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) #include <cstdio> #include ...

  8. libevent::事件::定时器

    #include <cstdio> #include <errno.h> #include <sys/types.h> #include <event.h&g ...

  9. [译]libev和libevent的设计差异

    本文译自what's the difference between libev and libevent? 作者是libev作者 [问]两个库都是为异步io调度而设计,在Linux上都是使用epoll ...

随机推荐

  1. 利用反射将Datatable、SqlDataReader转换成List模型

    1. DataTable转IList public class DataTableToList<T>whereT :new() { ///<summary> ///利用反射将D ...

  2. LR手工制作webServices接口类脚本

    首先通过抓包获得某个接口的码流消息,请求报文码分消息头和消息体,所以在制作脚本的时候也需要添加消息头和消息体. POST /jboss-bet/services/&** HTTP/1.1SOA ...

  3. (转)JAVA实现Windows拨号、IP切换

    原理: 通过调用windows下的dos命令实现拨号 PS:连接名称获取不一定都是适用,但苦于知道的dos命令太少了,只能将就这么用着. 如有更好的方法,烦请不吝赐教. public class Co ...

  4. 如何解决requireJs的模块加载超时

    requireJs的加载是一种异步机制,它加载js的时候有个默认的超时机制,当加载一个js超过一定时间的时候,它就会在浏览器中抛出模块加载超时错误,接下来,就不会加载这个模块. 这个机制其实是起到了节 ...

  5. python数据结构与算法——完全树 与 最小/大堆

    # 完全树 最小堆 class CompleteTree(list): def siftdown(self,i): """ 对一颗完全树进行向下调整,传入需要向下调整的节 ...

  6. 数论 UVA 10780

    数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1 ...

  7. UVA1583 最小生成元

    题很简单,主要是懂题意. 思想是枚举. #include<cstdio> #include<cstring> #define Max 100001 int ans[Max]; ...

  8. Razor基础语法简介

    http://blog.csdn.net/pasic/article/details/7072340 Razor的出现,使页面看起更加简洁,Razor的页面后缀为:.cshtml Razor基础语法: ...

  9. ssh远程连接错误

    在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  10. Java事务处理全解析(七)—— 像Spring一样使用Transactional注解(Annotation)

    在本系列的上一篇文章中,我们讲到了使用动态代理的方式完成事务处理,这种方式将service层的所有public方法都加入到事务中,这显然不是我们需要的,需要代理的只是那些需要操作数据库的方法.在本篇中 ...