Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95992
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-24 22:04
文章分类

全部博文(31)

文章存档

2014年(31)

我的朋友

分类: C/C++

2014-05-30 09:24:02



event_set()

点击(此处)折叠或打开

  1. void
  2. event_set(struct event *ev, int fd, short events,    //ev,事件指针,fd,事件需要绑定的文件描述符,events,时间类型,可以是EV_TIMEOUT,EV_READ等,
  3.      void (*callback)(int, short, void *), void *arg)  //callback,事件被触发时的回调函数,  arg,回调函数参数
  4. {
  5.     /* Take the current base - caller needs to set the real base later */
  6.     ev->ev_base = current_base;   //设定ev的eventbase为全局变量current_base

  7.     ev->ev_callback = callback;   //设定回调函数
  8.     ev->ev_arg = arg;    //设定回调函数参数
  9.     ev->ev_fd = fd;     //设定事件绑定的文件描述符
  10.     ev->ev_events = events;    //设定事件类型
  11.     ev->ev_res = 0;    //
  12.     ev->ev_flags = EVLIST_INIT;    //设定事件的链表类型,事件的默认链表类型是EVLIST_INIT
  13.     ev->ev_ncalls = 0;    //
  14.     ev->ev_pncalls = NULL;    //pncalls指针指向ncalls

  15.     min_heap_elem_init(ev);    //初始化ev在最小堆中的序号

  16.     /* by default, we put new events into the middle priority */
  17.     if(current_base)    
  18.         ev->ev_pri = current_base->nactivequeues/2;    //设定ev的默认优先级,指定current_base的活动队列的中间值为ev的默认优先级
  19. }
event_set()函数是读创建的event进行初始化工作,
(1) 绑定ev到event_base
(2) 设定ev的回调函数与参数
(3) 设定ev绑定的文件描述符
(4) 设定时间类型(EV_TIEMOUT,EV_READ,EV_WRITE等)
(5) 初始化ev在最小堆中的默认序号为-1
(6) 设定ev的优先级


如果该事件是定时器事件或者超时事件,调用的分别是evtimer_set宏与timeout_set宏

点击(此处)折叠或打开

  1. #define evtimer_set(ev, cb, arg)    event_set(ev, -1, 0, cb, arg)//初始化一个定时器事件

点击(此处)折叠或打开

  1. #define timeout_set(ev, cb, arg)    event_set(ev, -1, 0, cb, arg)//初始化一个超时事件
两个宏实际调用的都是event_set(ev, -1 , 0 , cb, arg )   //-1,定时器事件和超时时间默认的文件描述符指定为-1,0,表示EV_TIMEOUT事件类型


如果该事件是IO事件,

点击(此处)折叠或打开

  1. event_set(&evfifo, socket, EV_READ, fifo_read, &evfifo); //Event-test.c第127行
fd设置的是文件描述符的Id,events设定是ev的类型


如果该事件是signal事件,

点击(此处)折叠或打开

  1. event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb,
  2.      &signal_int)
fd设置的是信号名,上面指定的是中断信号SIGINT,事件类型是EV_SIGNAL|EV_PERSIST



event_base_set()

点击(此处)折叠或打开

  1. int //绑定base到ev,并设置ev的pri优先级
  2. event_base_set(struct event_base *base, struct event *ev)
  3. {
  4.     /* Only innocent events may be assigned to a different base */
  5.     if (ev->ev_flags != EVLIST_INIT) //ev_flags不是EVLIST_INIT,则返回
  6.         return (-1);

  7.     ev->ev_base = base;
  8.     ev->ev_pri = base->nactivequeues/2;

  9.     return (0);
  10. }
event_base_set()函数是作为event_set()的补充,该函数重新设置ev绑定的eventbase与ev的优先级
如果是通过event_base_new()创建的base,需要先调用event_set()函数先初始化event,再调用event_base_new()重新设置ev绑定的新的base
在Signal-test.c文件中,就是采用这个步骤重新设置ev绑定到的eventbase

点击(此处)折叠或打开

  1. /* Initalize the event library */
  2.     struct event_base* base = event_base_new();
  3.     /* Initalize one event */
  4.     event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb,
  5.      &signal_int);
  6.     event_base_set(base, &signal_int)







阅读(6899) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~