前言
在上一小节中我们主要讲解了信号事件是如何合并到多路I/O复用机制中的以及信号事件的初始化。在本小节中,我们将看到有关信号事件的主要操作。
信号事件的注册
前面我们看到了信号事件是在何时何地如何被初始化的,一个事件无非就是初始化、注册、激活、回调、注销这几个重要的操作。接下来我们看看信号事件注册相关的,即evsignal_add
函数,它在signal.c
文件中定义。
int
evsignal_add(struct event *ev)
{
int evsignal;
struct event_base *base = ev->ev_base;
struct evsignal_info *sig = &ev->ev_base->sig;
//读/写事件不属于这儿
if (ev->ev_events & (EV_READ|EV_WRITE))
event_errx(1, "%s: EV_SIGNAL incompatible use", __func__);
/*
* 这里是个宏函数,在event.h中定义如下
* #define EVENT_SIGNAL(ev) (int)(ev)->ev_fd
* 作用就是取得信号值
*/
evsignal = EVENT_SIGNAL(ev);
assert(evsignal >= 0 && evsignal < NSIG);
//没有事件注册到该evsignal信号上
if (TAILQ_EMPTY(&