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.cgcc -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