简介
ACE_Event_Handler是事件处理器,包含处理网络io,定时器以及信号,异常
结构
- 句柄相关:get_handle ,set_handle
- 优先级相关:priority,优先级的设置及获取
- 事件相关:handle_input ,handle_output ,handle_exception ,handle_timeout ,handle_exit(进程退出),handle_close(当handle_*方法返回-1时或者reactor调用remove_handler),handle_signal(处理信号)
- qos相关:handle_qos, handle_group_qos
- reactor相关:reactor的设置及获取
支持的事件类型有
- READ_MASK
- WRITE_MASK
- EXCEPT_MASK
- ACCEPT_MASK
- CONNECT_MASK
- TIMER_MASK
- QOS_MASK
- GROUP_QOS_MASK
- SIGNAL_MASK
信号事件
ACE_Sig_Handler用于管理事件,包含注册和删除信号相关的事件
ACE_Sig_Handler
其方法有
virtual int register_handler (int signum,ACE_Event_Handler *new_sh,ACE_Sig_Action *new_disp = 0,ACE_Event_Handler **old_sh = 0,ACE_Sig_Action *old_disp = 0);
virtual int remove_handler (int signum,ACE_Sig_Action *new_disp = 0,ACE_Sig_Action *old_disp = 0,int sigkey = -1);
static int sig_pending (void);
static void sig_pending (int);
virtual ACE_Event_Handler *handler (int signum);
virtual ACE_Event_Handler *handler (int signum, ACE_Event_Handler *);
static void dispatch (int, siginfo_t *,ucontext_t *);
void dump (void) const;
sig_pending_
处理信号事件的标识
ACE_Sig_Set
是对sigset_t
的封装,其原方法有
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *sest, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);
封装后方法为
int empty_set (void);
int fill_set (void);
int sig_add (int signo);
int sig_del (int signo);
int is_member (int signo) const;
operator sigset_t *();
sigset_t sigset (void) const;
void dump (void) const;
ACE_Sig_Action
是对sigaction
的封装,其原方法为
int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);
//sigaction定义
struct sigaction
{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_sigaction)(int, siginfo_t *, void*);
};
封装后方法有
int register_action (int signum,ACE_Sig_Action *oaction = 0);
int restore_action (int signum,ACE_Sig_Action &oaction);
int retrieve_action (int signum);
void set (struct sigaction *);
struct sigaction *get (void);
operator struct sigaction *();
void flags (int);
int flags (void);
void mask (sigset_t *);
void mask (ACE_Sig_Set &);
sigset_t *mask (void);
void handler (ACE_SignalHandler);
ACE_SignalHandler handler (void);
void dump (void) const;
handle_signal方法是在ACE_Sig_Handler::dispatch
中被调用,会将sig_pending_
置为1,reactor在handle_events
时会根据此标识判断是否有处理事件,同时将sig_pending_
复位
void
ACE_Sig_Handler::dispatch (int signum,
siginfo_t *siginfo,
ucontext_t *ucontext)
{
ACE_Errno_Guard error (errno);
ACE_Sig_Handler::sig_pending_ = 1;
ACE_ASSERT (ACE_Sig_Handler::in_range (signum));
ACE_Event_Handler *eh = ACE_Sig_Handler::signal_handlers_[signum];
if (eh != 0)
{
if (eh->handle_signal (signum, siginfo, ucontext) == -1)
ACE_Sig_Handler::remove_handler_i (signum);
#if defined (ACE_WIN32)
else
ACE_Sig_Handler::register_handler_i (signum, eh);
#endif /* ACE_WIN32*/
}
}
信号处理函数是通过ACE_Sig_Handler::register_handler_i
分为两种情况,一种是c函数,一个是c++的
c函数使用
extern "C" void
ace_sig_handler_dispatch (int signum, siginfo_t *info, ucontext_t *context)
{
ACE_TRACE ("ace_sig_handler_dispatch");
ACE_Sig_Handler::dispatch (signum, info, context);
}
#define ace_signal_handler_dispatcher ACE_SignalHandler(ace_sig_handler_dispatch)
extern "C" void
ace_sig_handlers_dispatch (int signum, siginfo_t *info, ucontext_t *context)
{
ACE_TRACE ("ace_sig_handlers_dispatch");
ACE_Sig_Handlers::dispatch (signum, info, context);
}
#define ace_signal_handlers_dispatcher ACE_SignalHandler(ace_sig_handlers_dispatch)
c++使用
#define ace_signal_handler_dispatcher ACE_SignalHandler(ACE_Sig_Handler::dispatch)
#define ace_signal_handlers_dispatcher ACE_SignalHandler(ACE_Sig_Handlers::dispatch)