libevent源码分析(2)--初始化

本文详细介绍了libevent库的初始化过程,包括event_init函数的工作流程及其内部调用的event_base_new函数的具体实现。深入剖析了event_base结构的创建、事件驱动模块的选择及绑定,以及信号处理和事件队列的初始化等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上面一篇文章介绍了几个比较重要的数据结构。。。接下来来看看libevent的初始化吧。。。

首先我们一般会先调用event_init函数,那就先从它开始吧:

struct event_base *
event_init(void)
{
	struct event_base *base = event_base_new();

	if (base != NULL)
		current_base = base;  //currentbaseÖ¸Ïò¸Ãbase

	return (base);
}
其实还是很简单的,就是创建一个event_base的结构,这里可以看到一个变量current_base,它是一个默认的base,当没有指明的时候,默认使用它。。。。接下来来看event_base_new函数吧:
struct event_base *
event_base_new(void)
{
	int i;
	struct event_base *base;

	if ((base = calloc(1, sizeof(struct event_base))) == NULL)  //创建base结构
		event_err(1, "%s: calloc", __func__);

	detect_monotonic();
	gettime(base, &base->event_tv);
	
	min_heap_ctor(&base->timeheap);  //堆的初始化
	TAILQ_INIT(&base->eventqueue);  //事件队列初始化
	base->sig.ev_signal_pair[0] = -1;
	base->sig.ev_signal_pair[1] = -1;
	
	base->evbase = NULL;
	for (i = 0; eventops[i] && !base->evbase; i++) {
		base->evsel = eventops[i];  //这个数组中保存了所有具体的模块定义的操作

		base->evbase = base->evsel->init(base); //具体操作的绑定,例如epoll的函数
	}

	if (base->evbase == NULL)
		event_errx(1, "%s: no event mechanism available", __func__);

	if (evutil_getenv("EVENT_SHOW_METHOD")) 
		event_msgx("libevent using: %s\n",
			   base->evsel->name);

	/* allocate a single active event queue */
	event_base_priority_init(base, 1);  //初始化激活事件优先级队列

	return (base);
}
其实还是很简单的吧,就是构造base结构,并进行一些初始化工作,例如绑定具体的事件驱动函数,因为底层有好几种事件的实现,所以需要选出一种具体的来用。。。另外还有一些与信号相关的内容,以及事件队列的初始化等。。。


好了,libevent的初始化貌似就差不多了吧。。貌似真简单。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值