libevent是怎么选择底层实现的

libevent封装了多种IO复用模式,如evport, select, poll, epoll等。底层实现的选择取决于event-config.h文件。该文件在configure检查环境后生成,其中的宏定义如EVENT__HAVE_EPOLL指示系统支持的特性。通过event_config_require_features函数指定所需的特性,event_base_new_with_config函数结合event-config.h中的宏定义选择合适的I/O模式。在Redhat环境中,如果未明确指定,通常会优先选择epoll,其次是poll,避免使用select。" 74938582,4626329,使用可持久化线段树解决[XJOI]排序列表问题,"['OI', '可持久化线段树', '哈希', '扫描线']
摘要由CSDN通过智能技术生成

1. libevent到底使用哪种io模式来作为底层实现

libevent实际封装了很多IO复用模式,比如evport,select,poll,epoll,devpoll等等,这些都是不同操作系统下的I/O多路复用模式,那么我们怎么知道当前使用的是哪种模式呢?

说到底层实现,那就不得不说说event-config.h文件的生成。

1.1 event-config.h文件的生成

在上一篇《libevent目录结构分析》中,我们提到event-config.h,它存放了很多宏定义配置。

event-config.h这个文件并不是一直不变的,这里有一个过程:

  • 首先,configure在检查环境依赖的时候会生成config.h和Makefile;
  • 然后,Makefile会根据config.h生成event-config.h;

event-config.h基本是存放宏定义的,如下:

/* Define to 1 if you have the <dlfcn.h> header file. */
#define EVENT__HAVE_DLFCN_H 1
/* Define if your system supports the epoll system calls */
#define EVENT__HAVE_EPOLL 1
/* Define to 1 if you have the `epoll_create1' function. */
/* #undef EVENT__HAVE_EPOLL_CREATE1 */
/* Define to 1 if you have the `epoll_ctl' function. */
#define EVENT__HAVE_EPOLL_CTL 1
/* Define to 1 if you have the <errno.h> header file. */
#define EVENT__HAVE_ERRNO_H 1

这个是在我的redhat环境下编译以后生成的部分宏定义,EVENT__HAVE_EPOLL这个宏定义为1则说明我的redhat环境是支持epoll的,但这并不能说明我当前就是使用的epoll,因为redhat同样支持select和poll。

1.2 I/O模式选择

那么底层实现到底用哪个呢,看下面代码:

struct event_config *config;
struct event_base *base;
/* Create a new configuration object. */
config = event_config_new();
/* We don't want to use the "select" method. */ 
event_config_avoid_method(config, "select");
/* We want a method that can work with non-socket file descriptors */ 
event_config_require_features(config, EV_FEATURE_FDS);
base = event_base_new_with_config(config)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp加油站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值