libevent是一个跨平台的,事件驱动框架,支持文件描述符,定时器,信号;
一.安装
libevent官网下载当前最新的版本libevent-2.0.22-stable.tar.gz;
tar -xvf libevent-2.0.22-stable.tar.gz;
cd cd libevent-2.0.22-stable
./configure --prefix=/mydir
make
make install
安装完后,可以看到安装后的额目录结构如下:
mydir
├── bin
│ └── event_rpcgen.py
├── include
│ ├── evdns.h
│ ├── event2
│ │ ├── buffer_compat.h
│ │ ├── bufferevent_compat.h
│ │ ├── bufferevent.h
│ │ ├── bufferevent_ssl.h
│ │ ├── bufferevent_struct.h
│ │ ├── buffer.h
│ │ ├── dns_compat.h
│ │ ├── dns.h
│ │ ├── dns_struct.h
│ │ ├── event_compat.h
│ │ ├── event-config.h
│ │ ├── event.h
│ │ ├── event_struct.h
│ │ ├── http_compat.h
│ │ ├── http.h
│ │ ├── http_struct.h
│ │ ├── keyvalq_struct.h
│ │ ├── listener.h
│ │ ├── rpc_compat.h
│ │ ├── rpc.h
│ │ ├── rpc_struct.h
│ │ ├── tag_compat.h
│ │ ├── tag.h
│ │ ├── thread.h
│ │ └── util.h
│ ├── event.h
│ ├── evhttp.h
│ ├── evrpc.h
│ └── evutil.h
├── lib
│ ├── libevent-2.0.so.5 -> libevent-2.0.so.5.1.9
│ ├── libevent-2.0.so.5.1.9
│ ├── libevent.a
│ ├── libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9
│ ├── libevent_core-2.0.so.5.1.9
│ ├── libevent_core.a
│ ├── libevent_core.la
│ ├── libevent_core.so -> libevent_core-2.0.so.5.1.9
│ ├── libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9
│ ├── libevent_extra-2.0.so.5.1.9
│ ├── libevent_extra.a
│ ├── libevent_extra.la
│ ├── libevent_extra.so -> libevent_extra-2.0.so.5.1.9
│ ├── libevent.la
│ ├── libevent_openssl-2.0.so.5 -> libevent_openssl-2.0.so.5.1.9
│ ├── libevent_openssl-2.0.so.5.1.9
│ ├── libevent_openssl.a
│ ├── libevent_openssl.la
│ ├── libevent_openssl.so -> libevent_openssl-2.0.so.5.1.9
│ ├── libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9
│ ├── libevent_pthreads-2.0.so.5.1.9
│ ├── libevent_pthreads.a
│ ├── libevent_pthreads.la
│ ├── libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9
│ ├── libevent.so -> libevent-2.0.so.5.1.9
│ └── pkgconfig
│ ├── libevent_openssl.pc
│ ├── libevent.pc
│ └── libevent_pthreads.pc
└── local
├── include
│ └── hiredis
│ ├── adapters
│ │ ├── ae.h
│ │ ├── glib.h
│ │ ├── ivykis.h
│ │ ├── libevent.h
│ │ ├── libev.h
│ │ ├── libuv.h
│ │ ├── macosx.h
│ │ └── qt.h
│ ├── async.h
│ ├── hiredis.h
│ ├── read.h
│ └── sds.h
└── lib
├── libhiredis.a
├── libhiredis.so -> libhiredis.so.0.13
├── libhiredis.so.0.13
└── pkgconfig
└── hiredis.pc
二.使用
2.1 定时器和信号
test_event.c:
#include<stdio.h>
#include<signal.h>
#include<event2/event.h>
void onTime(int fd, short event, void* arg)
{
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
printf("onTime called ! \n");
event_add( *(struct event**)arg, &tv);
}
void onSigusr1(int sig, short event, void* arg)
{
printf("recieve sig %d \n", sig);
}
int main()
{
struct event_base* base = NULL;
struct event* timer = NULL;
struct timeval tv;
struct event* esig = NULL;
base = event_base_new();
if(!base){
printf("event_base_new() failed !\n");
}
//增加定时器
timer = evtimer_new(base, onTime, &timer);
tv.tv_sec = 10;
tv.tv_usec = 0;
event_add(timer, &tv);
//增加信号监听
esig = evsignal_new(base, SIGUSR1, onSigusr1, NULL);
event_add(esig, NULL);
event_base_dispatch(base);
return 0;
}
makefile
all:test_event.c
gcc -o test_event test_event.c -I/mydir/include -L/mydir/lib -levent
运行结果 , (中间向进程发了一次SIGUSR1信号):
./test_event
onTime called !
onTime called !
recieve sig 10
onTime called !
2.2 socket
参考Example: A low-level ROT13 server with Libevent