没有合适的资源?快使用搜索试试~ 我知道了~
首页Libevent源码分析 pdf文档 带目录
资源详情
资源评论
资源推荐
Libevent 源码分析-----event-config.h 指明所在系统的环境
分类: Libevent 源码分析 2014-07-30 15:24 930 人阅读 评论(0) 收藏 举报
Libevent
转载请注明出处: http://blog.csdn.net/luotuo44/article/details/38300965
如果你打开 Libevent 的一些文件,比如 util.h 文件。就会发现使用了很多宏定义,
并根据一些宏定义而进行条件编译。这些宏定义往往来自 event-config.h 文件中。
如 util.h 文件的代码开始处:
[cpp] view plaincopy
1. #ifdef _EVENT_HAVE_SYS_TIME_H
2. #include <sys/time.h>
3. #endif
4. #ifdef _EVENT_HAVE_STDINT_H
5. #include <stdint.h>
6. #elif defined(_EVENT_HAVE_INTTYPES_H)
7. #include <inttypes.h>
8. #endif
其会根据是否定义了某个宏,而决定是否包含某个头文件。从宏的名字来看,其指
明了是否有这个头文件。有时还会指明是否有某个函数。这样做的原因很简单,因为
Libevent 是跨平台的,必须得考虑到某些系统可能没有一些头文件或者函数。
event-config.h 文件是一个很基础和重要的文件。在文件的一开始有这样一句"This
file was generated by autoconf when libevent was built"。这说明这个文件是在 Libevent
配置的时候生成的,即在编译 Libevent 之前就应该要生成该文件了。当然也早于我们在
Libevent 基础上编写应用程序。
其在编译之前就检查所在的系统的一些情况。比如是否含有某个文件或者函数。其
对这些进行检测,然后把结果写入到 event-config.h 文件中。等到编译 Libevent 和编译我
们的 APP 时,会 include 该头文件。
PS:上面两段的说法有点错误。待修改。
该文件大部分内容是根据 config.h.in 文件生成的。比如,config.h.in 文件里面有下
面的代码:
[cpp] view plaincopy
1. /* Define to 1if you have the <arpa/inet.h> header file. */
2. #undefHAVE_ARPA_INET_H
3. .....
4. /* Define ifyour system supports the epoll system calls */
5. #undefHAVE_EPOLL
对应地,Linux 内核版本在 2.6 以上的 Linux 对应生成的 event-config.h 文件会定义
这两个宏,如下:
[cpp] view plaincopy
1. /* Define to 1if you have the <arpa/inet.h> header file. */
2. #define_EVENT_HAVE_ARPA_INET_H 1
3. ......
4. /* Define to 1if you have the <sys/epoll.h> header file. */
5. #define_EVENT_HAVE_SYS_EPOLL_H 1
而在 Windows 系统下生成的 event-config.h 文件就没有定义这两个宏。
可以说,event-config.h 这个文件定义的宏指明了所在的系统有哪些可用的头文件、
函数和一些配置。
又比如对于 gcc 来说,是支持__func__这个宏的,但对于 VS 编译器就不支持,VS
对应功能的宏为__FUNCTION__。此时在 Windows 系统的 event-config.h 文件中,就会
定义:
[cpp] view plaincopy
1. /* Define toappropriate substitue if compiler doesnt have __func__ */
2. #define_EVENT___func__ __FUNCTION__
而在 util-internal.h 文件中,有这样的定义:
[cpp] view plaincopy
1. #ifdef_EVENT___func__
2. #define __func___EVENT___func__
3. #endif
这样就可以在其他文件中通用__func__宏了,无需关注是什么系统了。
event-config.h 文件的有些内容是根据编译 Libevent 时的配置选项生成的。比如是
否支持多线程这个选项。如果配置 Libevent 的时,加入了这样一句
[cpp] view plaincopy
1. ./configure--disable-thread-support
那么,在 event-config.h 文件将定义 DISABLE_THREAD_SUPPORT 这个宏,此时
得到的 Libevent 是不支持多线程的。
Libevent 源码分析-----日志和错误处理
分类: Libevent 源码分析 2014-07-31 16:05 1046 人阅读 评论(0) 收藏 举报
Libevent
目录(?)[+]
转载请注明出处: http://blog.csdn.net/luotuo44/article/details/38317797
日志处理:
在 Libevent 的源码中,经常会见到形如 event_warn、event_msgx、event_err 之类
的函数。这通常出现在代码中一些值是不合理时。这些函数就是 Libevent 的日志函数。它
能把这些不合理的情况打印出来,告知用户。
定制日志回调函数:
Libevent 在默认情况下,会将这些日志信息输出到终端上。这当然就不利于日后的
观察。为此,Libevent 允许用户定制自己的日志回调函数。所有的日志函数在最后输出信
息时,都会调用日志回调函数的。所以用户可以通过定制自己的日志回调函数(在回调函
数中把信息输出到一个文件上),方便日后的查看。定制回调函数就像设置自己信号处理
函数那样,设置一个日志回调函数。当有日志时,Libevent 库就会调用这个日志回调函
数。
回调函数的格式和日志定制函数如下所示:
[cpp] view plaincopy
1. typedef void (*event_log_cb)(int severity, const char *msg);
2. void event_set_log_callback(event_log_cb cb);
回调函数中的第一个参数 severity 是日志级别类型,有下面这些:
[cpp] view plaincopy
1. #define EVENT_LOG_DEBUG 0
2. #define EVENT_LOG_MSG 1
3. #define EVENT_LOG_WARN 2
4. #define EVENT_LOG_ERR 3
5.
6. /* Obsolete names: these are deprecated, but older programs might use them.
7. * They violate the reserved-identifier namespace. */
8. #define _EVENT_LOG_DEBUG EVENT_LOG_DEBUG
9. #define _EVENT_LOG_MSG EVENT_LOG_MSG
10. #define _EVENT_LOG_WARN EVENT_LOG_WARN
11. #define _EVENT_LOG_ERR EVENT_LOG_ERR
值得注意的是,不能在你的日志回调函数里面调用任何 Libevent 提供的 API 函数,
否则将发生未定义行为。
在实现上,Libevent 是通过定义一个全局函数指针变量来保存用户在日志定制函数
中传入的参数 cb。日志定制函数在实现上也是很简单的
[cpp] view plaincopy
1. static event_log_cb log_fn = NULL;
2. void
3. event_set_log_callback(event_log_cb cb)
4. {
5. log_fn = cb;
6. }
从 event_set_log_callback 的实现代码可以看到,并没有对这个参数 cb 做任何检
查。
Libevent 的默认日志处理函数 event_log 函数还是很简陋的,只是简单地根据参数
判断日志记录的级别,然后把级别和日志内容输出。复杂一点的日志功能,可以参考
muduo 日志功能。当然也有 log4pp、log4xx 这些把一个重量级的日志库。
[cpp] view plaincopy
1. static void
2. event_log(int severity, const char *msg)
3. {
4. if (log_fn)
5. log_fn(severity, msg);//调用用户的日志回调函数
6. else {
7. const char *severity_str;
8. switch (severity) {
9. case _EVENT_LOG_DEBUG:
10. severity_str = "debug";
11. break;
12. case _EVENT_LOG_MSG:
13. severity_str = "msg";
14. break;
15. case _EVENT_LOG_WARN:
16. severity_str = "warn";
17. break;
18. case _EVENT_LOG_ERR:
19. severity_str = "err";
20. break;
21. default:
22. severity_str = "???";
23. break;
24. }
25. (void)fprintf(stderr, "[%s] %s\n", severity_str, msg);//输出到标准错
误终端上
26. }
27. }
从 event_log 函数中可以看到,当函数指针 log_fn 不用 NULL 时,就调用 log_fn 指
向的函数。否则就直接向 stderr 输出日志信息。所以,设置自己的日志回调函数后,如果想
恢复 Libevent 默认的日志回调函数,只需再次调用 event_set_log_callback 函数,参数设
置为 NULL 即可。
日志 API 以及日志消息处理流程:
Libevent 的日志 API 的使用也是挺简单的。首先,使用者确定要记录的日志的级别
和错误类型,然后调用对应的日志函数。有下面这些可供选择的日志函数。
[cpp] view plaincopy
1. void event_err(int eval, const char *fmt, ...);
2. void event_warn(const char *fmt, ...);
3. void event_sock_err(int eval, evutil_socket_t sock, const char *fmt, ...);
4. void event_sock_warn(evutil_socket_t sock, const char *fmt, ...);
5.
6. void event_errx(int eval, const char *fmt, ...);
7. void event_warnx(const char *fmt, ...);
8. void event_msgx(const char *fmt, ...);
9. void _event_debugx(const char *fmt, ...);
剩余261页未读,继续阅读
f45760
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1