Libevent 定時器

先摘一點網上的介紹html

 

libevent是一個事件觸發的網絡庫,適用於windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue等系統調用管理事件機制。著名分佈式緩存軟件memcached也是libevent based,並且libevent在使用上能夠作到跨平臺,並且根據libevent官方網站上公佈的數據統計,彷佛也有着非凡的性能。linux

 

接着咱們先直接看一個例子,該例子每隔幾秒輸出一個句子ios

#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 = {2, 0};
    event_base *base = event_base_new();
    event *timeout = event_new(base, -1, EV_PERSIST|EV_TIMEOUT, cb, NULL);
    event_add(timeout, &two_sec);
    event_base_dispatch(base);
    return 0;
}

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進行網絡編程的話大概也就是這個流程。windows