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 }
下面就通过分析这个简单的例子来弄清楚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的封装。