libevent简单使用小结

来源:互联网 发布:java无限循环停止代码 编辑:程序博客网 时间:2024/06/06 03:19

一、简单使用流程

1、首先需要有一个总控结构,即为一个事件集——函数原型:event_int()

      struct event_base* main_base;

      main_base = event_init();或者 main_base = event_base_new();


2、事件

      事件就是我们关心的、需要我们写函数进行处理的主体

       struct event ev;

      给事件添加处理回调函数——函数原型:

event_assign( struct event* ev,struct event_base* base,int fd, short event,\

              (void*)(*fn)(int ,short,void*), (void*)arg )

   int fd 指定要监视的文件描述符(如果仅为设置一个定时器,可不设置fd,直接给-1)

   short event 可以是EV_READ,EV_WRITEEV_READ|EV_WRITE表示该文件可以无阻塞地进行读写.

   fn函数将会被调用,并传递给三个变量:

   int fd:触发事件的文件描述符.

   short event:触发事件的类型EV_TIMEOUT,EV_SIGNALEV_READ, or EV_WRITE.

   void* :arg参数指定的变量.

   另外重复注册的事件将会产生重复的事件通知.EV_PERSIST可以让注册的事件在执行完后不被删除,直到调用event_del()删除.

   event_assign(&ev,main_base,s,EV_XXX|EV_PESIST,callback_handle,arg)有两个作用

  (1)将事件ev和总控集main_base关联,等到main_base循环时,可以监控ev的状态

  (2)把观察对象s加入到事件ev中,当EV_XXX事件发生时,调用callback_handle函数,arg为回调的参数,

        EV_PESIST表示当进入回调后,ev事件继续保存在event queue(即仍在main_base观察的事件中)


3、超时时间

      使用结构struct timeval tv;

      EV_TIMEOUT标志表示某超时时间流逝后事件成为激活的;构造事件的时候,EV_TIMEOUT标志是被忽略的:可以在添加事件的时候设置超时,也可以不设置。

  (即使此处不设置超时时间,在下一步中event_set一个超时时间,就相当于此处set了超时事件)


4、事件加入事件队列,被总控时间集调度

   event_add(&ev,&tv);

   把ev注册到main_base中去,tv为超时时间;

 

5、循环事件队列,处理事件

   event_base_dispatch(main_base);

   如果main_base中的事件是EV_PERSIST的,则该函数会阻塞,一直循环dispatch   

0 0
原创粉丝点击