前面我们对整个event
的功能做了比较全面的分析, 但是主要分析事件都是 IO或者定时事件, 却没有分析过信号又是怎么集成到就绪队列中的.
evsignal_info结构
evsignal_info
在evsignal.h
中
typedef void (*ev_sighandler_t)(int);
struct evsignal_info {
// 读事件使用的 event 结构
struct event ev_signal;
// ev_signal_pair[1] : 作为 read 放入事件到循环中监听, 当有信号时
// 通过写入 ev_signal_pair[0], 这样就可以唤醒并回调与 ev_signal_pair[1] 关联并执行.
// 这样的处理的好处就是不用关心中断的问题. 当同时有多个信号时这样的处理更加的高效迅速
int ev_signal_pair[2];
// 事件信号是否加入了 event_loop主循环中
int ev_signal_added;
// 表示捕捉到信号, 并且是 volatile 类型
volatile sig_atomic_t evsignal_caught;
// 信号队列. 这样设置成数组链表好处是可以响应相同信号
struct event_list evsigevents[NSIG];
// 每个信号捕捉到的次数
sig_atomic_t evsigcaught[NSIG];