#include #include #include 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; }