先摘一点网上的介绍

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. Spark随笔(一):Spark的综合认识

    一.Spark与Hadoop的关系 Spark和Hadoop只是共用了底层的MapReduce编程模型,即它们均是基于MapReduce思想所开发的分布式数据处理系统. Hadoop采用MapRedu ...

  2. QUICK START GUIDE

    QUICK START GUIDE This page is a guide aimed at helping anyone set up a cheap radio scanner based on ...

  3. 实时刷新Winform中Label的Text

    最直白的例子: private void btnStart_Click(object sender, EventArgs e) { ; ) { labelTime.Text = i.ToString( ...

  4. PHP中常用的函数

    1.php 字符串截取函数 2.php取得当前时间函数 3.php 字符串长度函数 4.几种php 删除数组元素方法 5.php中var_dump()函数的详解说明 6.PHP preg_match正 ...

  5. 【Avalon】factory

    (function(global, factory) { if (typeof module === "object" && typeof module.expor ...

  6. systemtap折腾笔记

    在这货上花费了不少时间,都是受了@agentzh 大神的蛊惑:) 他写的nginx-systemtap-toolkit监测的数据很有价值,对于系统优化实在是利器. 最早折腾systemtap,是在Ub ...

  7. [转]设置Android手机以使用ARM Streamline进行性能分析(二)

    原文因为arm社区改版访问不到了,原作者鲍方,原文地址,这篇是从google cache里挖出来的,希望能帮到要对cocos2dx优化的各位   Posted by Fang Bao, Leave C ...

  8. 图数据库(graph database)资料收集和解析 - daily

    Motivation 图数据库中的高科技和高安全性中引用了一个关于图数据库(graph database)的应用前景的乐观估计: 预计到2017年,图数据库产业在数据库市场的份额将从2个百分点增长到2 ...

  9. 我用工具怎么连接不上mysql数据库的? MySql access denied for user错误

    MySql access denied for user错误 方法/步骤   MySql远程连接时的"access denied for user **@**"错误,搞的我很头大, ...

  10. python学习之路(一)屌丝逆袭之路

    变量                                                                                                  ...