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.

59 lines
1.4 KiB

  1. #include <iostream>
  2. #include <event2/event.h>
  3. #include <signal.h>
  4. using namespace std;
  5. //sock 文件描述符 which 事件类型 arg传递的参数
  6. static void Ctrl_C(int sock,short which , void* arg){
  7. cout << "Ctrl_C" << endl;
  8. }
  9. static void Kill(int sock,short which , void* arg){
  10. cout << "Kill" << endl;
  11. event *ev = (event*)arg;
  12. //如果处于非待决
  13. if(!evsignal_pending(ev,NULL)){
  14. event_del(ev);
  15. event_add(ev,NULL); //再次添加进来
  16. }
  17. }
  18. int main(int agrc,char** agrv){
  19. event_base *base = event_base_new();
  20. //添加信号 ctrl+c ,处于no pending 状态
  21. //evsignal_new 隐藏的状态 EV_SIGNAL|EV_PERSIST
  22. event *csig = evsignal_new(base,SIGINT,Ctrl_C,base);
  23. if(!csig){
  24. cerr << "SIGNAL evsignal_new failed!" << endl;
  25. return -1;
  26. }
  27. if (event_add(csig,0) != 0){
  28. cerr << "SIGANL event_add failed" << endl;
  29. }
  30. //添加kill信号
  31. //非持久事件,只进入一次 event_self_cbarg()传递当前的event
  32. event *ksig = event_new(base,SIGTERM,EV_SIGNAL,Kill,
  33. event_self_cbarg());
  34. if(!ksig){
  35. cerr << "SIGNAL evsignal_new failed!" << endl;
  36. return -1;
  37. }
  38. if (event_add(ksig,0) != 0){
  39. cerr << "SIGANL event_add failed" << endl;
  40. }
  41. //进入事件主循环
  42. event_base_dispatch(base);
  43. event_free(csig);
  44. event_base_free(base);
  45. return 0;
  46. }