You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.1 KiB

  1. #include <iostream>
  2. #include <event2/event.h>
  3. #include <signal.h>
  4. using namespace std;
  5. bool isexit = false;
  6. //sock 文件描述符 which 事件类型 arg传递的参数
  7. static void Ctrl_C(int sock,short which , void* arg){
  8. cout << "Ctrl_C" << endl;
  9. event_base * base = (event_base *)arg;
  10. //执行完当前事件函数退出
  11. //event_base_loopbreak(base);
  12. //运行完所有的活动事件在退出,事件循环没有运行时,也要等运行一次在退出
  13. timeval t= {3,0}; //至少运行3s退出
  14. event_base_loopexit(base,&t);
  15. }
  16. static void Kill(int sock,short which , void* arg){
  17. cout << "Kill" << endl;
  18. event *ev = (event*)arg;
  19. //如果处于非待决
  20. if(!evsignal_pending(ev,NULL)){
  21. event_del(ev);
  22. event_add(ev,NULL); //再次添加进来
  23. }
  24. }
  25. int main(int agrc,char** agrv){
  26. event_base *base = event_base_new();
  27. //添加信号 ctrl+c ,处于no pending 状态
  28. //evsignal_new 隐藏的状态 EV_SIGNAL|EV_PERSIST
  29. event *csig = evsignal_new(base,SIGINT,Ctrl_C,base);
  30. if(!csig){
  31. cerr << "SIGNAL evsignal_new failed!" << endl;
  32. return -1;
  33. }
  34. if (event_add(csig,0) != 0){
  35. cerr << "SIGANL event_add failed" << endl;
  36. }
  37. //添加kill信号
  38. //非持久事件,只进入一次 event_self_cbarg()传递当前的event
  39. event *ksig = event_new(base,SIGTERM,EV_SIGNAL,Kill,
  40. event_self_cbarg());
  41. if(!ksig){
  42. cerr << "SIGNAL evsignal_new failed!" << endl;
  43. return -1;
  44. }
  45. if (event_add(ksig,0) != 0){
  46. cerr << "SIGANL event_add failed" << endl;
  47. }
  48. //进入事件主循环
  49. //event_base_dispatch(base);
  50. //EVLOOP_ONCE 等待一个事件运行,直到没有活动事件就退出
  51. //EVLOOP_NONBLOCK 有活动事件就处理,没有就返回0
  52. //event_base_loop(base,EVLOOP_NONBLOCK);
  53. // while (isexit)
  54. // {
  55. // event_base_loop(base,EVLOOP_NONBLOCK);
  56. // }
  57. //没有注册事件也不返回,用于事件后期多线程添加
  58. event_base_loop(base,EVLOOP_NO_EXIT_ON_EMPTY);
  59. event_free(csig);
  60. event_base_free(base);
  61. return 0;
  62. }