最近接触libevent,拜读“sparkliang”十年前的博文,受益匪浅。但学习中对比libevent-2.1.8 src发现,随着版本演变,文中有些内容不再适用。博客本是很主观的东西,作者书写时的心境已经随风而逝。后来者可进入其当时的心境,但是不可一味盲从甚至奉若神明。
libevent可将IO、定时、信号等事件纳入到主event处理流程event_base_dispatch。现以epoll IO复用为例,梳理下linux下对signal的集成过程。
最开始可追溯到event_init的执行。此函数的功用是new一个struct event_base* base,并初始化某些成员。在这过程中base->evsel = epollops,
const struct eventop epollops = {
"epoll",
epoll_init,
epoll_nochangelist_add,
epoll_nochangelist_del,
epoll_dispatch,
epoll_dealloc,
1, /* need reinit */
EV_FEATURE_ET|EV_FEATURE_O1|EV_FEATURE_EARLY_CLOSE,
0
};
epoll_init也在event_init中被调用,为接下来的架构运行构建基础设施。epoll_init篇幅较长,跟signal有关是它进行了evsig_init_,
int
evsig_init_(struct event_base *base)
{
/*
* Our signa