|
@ -0,0 +1,84 @@ |
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <event2/event.h>
|
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
|
|
|
|
bool isexit = false; |
|
|
|
|
|
|
|
|
|
|
|
//sock 文件描述符 which 事件类型 arg传递的参数
|
|
|
|
|
|
static void Ctrl_C(int sock,short which , void* arg){ |
|
|
|
|
|
cout << "Ctrl_C" << endl; |
|
|
|
|
|
event_base * base = (event_base *)arg; |
|
|
|
|
|
|
|
|
|
|
|
//执行完当前事件函数退出
|
|
|
|
|
|
//event_base_loopbreak(base);
|
|
|
|
|
|
|
|
|
|
|
|
//运行完所有的活动事件在退出,事件循环没有运行时,也要等运行一次在退出
|
|
|
|
|
|
timeval t= {3,0}; //至少运行3s退出
|
|
|
|
|
|
event_base_loopexit(base,&t); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void Kill(int sock,short which , void* arg){ |
|
|
|
|
|
cout << "Kill" << endl; |
|
|
|
|
|
|
|
|
|
|
|
event *ev = (event*)arg; |
|
|
|
|
|
//如果处于非待决
|
|
|
|
|
|
if(!evsignal_pending(ev,NULL)){ |
|
|
|
|
|
event_del(ev); |
|
|
|
|
|
event_add(ev,NULL); //再次添加进来
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int main(int agrc,char** agrv){ |
|
|
|
|
|
|
|
|
|
|
|
event_base *base = event_base_new(); |
|
|
|
|
|
|
|
|
|
|
|
//添加信号 ctrl+c ,处于no pending 状态
|
|
|
|
|
|
//evsignal_new 隐藏的状态 EV_SIGNAL|EV_PERSIST
|
|
|
|
|
|
event *csig = evsignal_new(base,SIGINT,Ctrl_C,base); |
|
|
|
|
|
|
|
|
|
|
|
if(!csig){ |
|
|
|
|
|
cerr << "SIGNAL evsignal_new failed!" << endl; |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (event_add(csig,0) != 0){ |
|
|
|
|
|
cerr << "SIGANL event_add failed" << endl; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//添加kill信号
|
|
|
|
|
|
//非持久事件,只进入一次 event_self_cbarg()传递当前的event
|
|
|
|
|
|
event *ksig = event_new(base,SIGTERM,EV_SIGNAL,Kill, |
|
|
|
|
|
event_self_cbarg()); |
|
|
|
|
|
|
|
|
|
|
|
if(!ksig){ |
|
|
|
|
|
cerr << "SIGNAL evsignal_new failed!" << endl; |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (event_add(ksig,0) != 0){ |
|
|
|
|
|
cerr << "SIGANL event_add failed" << endl; |
|
|
|
|
|
} |
|
|
|
|
|
//进入事件主循环
|
|
|
|
|
|
//event_base_dispatch(base);
|
|
|
|
|
|
|
|
|
|
|
|
//EVLOOP_ONCE 等待一个事件运行,直到没有活动事件就退出
|
|
|
|
|
|
//EVLOOP_NONBLOCK 有活动事件就处理,没有就返回0
|
|
|
|
|
|
//event_base_loop(base,EVLOOP_NONBLOCK);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// while (isexit)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// event_base_loop(base,EVLOOP_NONBLOCK);
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
//没有注册事件也不返回,用于事件后期多线程添加
|
|
|
|
|
|
event_base_loop(base,EVLOOP_NO_EXIT_ON_EMPTY); |
|
|
|
|
|
event_free(csig); |
|
|
|
|
|
event_base_free(base); |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
} |