libevent源码分析:signal-test例子

signal-test是libevent自带的一个例子,展示了libevent对于信号事件的处理方法。

 1 #include <sys/types.h>
 2 
 3 #include <event2/event-config.h>
 4 
 5 #include <sys/stat.h>
 6 #include <sys/queue.h>
 7 #include <unistd.h>
 8 #include <sys/time.h>
 9 #include <signal.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <errno.h>
15 
16 #include <event2/event.h>
17 
18 int called = 0;
19 
20 static void signal_cb(evutil_socket_t fd, short event, void *arg)
21 {
22     struct event *signal = arg;
23 
24     printf("%s:%d:%s: got signal %d\n", __FILE__, __LINE__, __func__, event_get_signal(signal));
25 
26     if (called >= 2)
27     {
28         event_del(signal);
29     }
30 
31     called++;
32 }
33 
34 int main(void)
35 {
36     struct event *signal_int;
37     struct event_base *base;
38 
39     /* Initialize the event library */
40     base = event_base_new();
41 
42     /* Initialize one event */
43     signal_int = evsignal_new(base, SIGINT, signal_cb, event_self_cbarg());
44 
45     event_add(signal_int, NULL);
46 
47     event_base_dispatch(base);
48     event_base_free(base);
49 
50     return 0;
51 }
View Code

下面就通过分析这个简单的例子来弄清楚libevent对于信号事件是如何处理的:

1、调用event_base_new方法获取一个event_base对象。

2、调用evsignale_new方法获取一个event对象。

3、调用event_add方法激活该event对象。

4、调用event_dispatch方法启动事件循环。

5、从事件循环中退出后,释放资源。

从代码中可以看出,对于信号事件的处理,跟IO事件有差别的地方就是evsignal_new函数,打开evsignale_new函数的定义:

1 #define evsignal_new(b, x, cb, arg)                \
2     event_new((b), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg))

在include/event2/event.h中有这样一个宏定义,其实evsignal_new就是对event_new的封装。

posted @ 2016-12-13 07:28  冷冰若水  阅读(1155)  评论(0编辑  收藏  举报