`
simohayha
  • 浏览: 1386361 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

libev简单使用介绍

阅读更多
更详细的用法请看他的文档:

http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod

struct ev_loop *ev_default_loop (unsigned int flags)
struct ev_loop *ev_loop_new (unsigned int flags)


这两个函数都是默认初始化一个loop,区别是第一个不是线程安全的,第二个不能捕捉信号和子进程的watcher。

参数flags可以为下面几种类型:

引用
#define EVFLAG_AUTO       0x00000000U /* not quite a mask */
/* flag bits */
#define EVFLAG_NOENV      0x01000000U /* do NOT consult environment */
#define EVFLAG_FORKCHECK  0x02000000U /* check for a fork in each iteration */
/* method bits to be ored together */
#define EVBACKEND_SELECT  0x00000001U /* about anywhere */
#define EVBACKEND_POLL    0x00000002U /* !win */
#define EVBACKEND_EPOLL   0x00000004U /* linux */
#define EVBACKEND_KQUEUE  0x00000008U /* bsd */
#define EVBACKEND_DEVPOLL 0x00000010U /* solaris 8 */ /* NYI */
#define EVBACKEND_PORT    0x00000020U /* solaris 10 */


ev_default_fork ()
ev_loop_fork (loop)


这两个函数就是当你在子进程里需要使用libev的函数的之前必须要调用。他们的区别是第二个函数是当使用ev_loop_new创建的loop时,才用第二个函数,也就是说重用父进程创建的loop。

ev_loop (loop, int flags)



开始事件循环。


ev_TYPE_init (ev_TYPE *watcher, callback, [args])


初始化一个watcher。TYPE也就是libev支持的事件类型,比如io,比如time等等。。

第一个参数为一个watcher,第二个回调函数,第三个句柄,第四个事件类型。包含下面几种:

引用
#define EV_UNDEF            -1 /* guaranteed to be invalid */
#define EV_NONE           0x00 /* no events */
#define EV_READ           0x01 /* ev_io detected read will not block */
#define EV_WRITE          0x02 /* ev_io detected write will not block */
#define EV_IOFDSET        0x80 /* internal use only */
#define EV_TIMEOUT  0x00000100 /* timer timed out */
#define EV_PERIODIC 0x00000200 /* periodic timer timed out */
#define EV_SIGNAL   0x00000400 /* signal was received */
#define EV_CHILD    0x00000800 /* child/pid had status change */
#define EV_STAT     0x00001000 /* stat data changed */
#define EV_IDLE     0x00002000 /* event loop is idling */
#define EV_PREPARE  0x00004000 /* event loop about to poll */
#define EV_CHECK    0x00008000 /* event loop finished poll */
#define EV_EMBED    0x00010000 /* embedded event loop needs sweep */
#define EV_FORK     0x00020000 /* event loop resumed in child */
#define EV_ASYNC    0x00040000 /* async intra-loop signal */
#define EV_ERROR    0x80000000 /* sent when an error occurs */


引用
ev_TYPE_start (loop *, ev_TYPE *watcher)


启动一个watcher。

例子:

  #include <ev.h>
   #include <stdio.h> 
   
   //不同的watcher
   ev_io stdin_watcher;
   ev_timer timeout_watcher;
    ev_timer timeout_watcher_child;
    
    //标准输入的回调函数
   static void
   stdin_cb (EV_P_ ev_io *w, int revents)
   {
     puts ("stdin ready");

     ev_io_stop (EV_A_ w);

     ev_unloop (EV_A_ EVUNLOOP_ALL);
   }
   
   //父进程的定时器回调函数
   static void
   timeout_cb (EV_P_ ev_timer *w, int revents)
   {
     puts ("timeout");
     ev_unloop (EV_A_ EVUNLOOP_ONE);
   }
   //子进程的定时器回调函数
   static void
    timeout_cb_child (EV_P_ ev_timer *w, int revents)
   {
     puts ("child timeout");
     ev_unloop (EV_A_ EVUNLOOP_ONE);
   }
   int
   main (void)
   {
   	//创建一个backend为select的loop
     struct ev_loop *loop = ev_loop_new(EVBACKEND_SELECT);
     
     //初始化并启动父进程的watcher
    ev_timer_init(&timeout_watcher, timeout_cb, 10, 0.);
    ev_timer_start(loop, &timeout_watcher);
    switch (fork()) {
                case -1:
                    return -1;
                case 0:
                	//使用父进程loop。
                    ev_loop_fork(loop);
                    //子进程的loop
                    struct ev_loop *loop_child = ev_loop_new (EVBACKEND_SELECT);
                     ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
                     ev_io_start (loop, &stdin_watcher);
                    ev_timer_init(&timeout_watcher_child, timeout_cb_child, 5.5, 0.);
                    ev_timer_start(loop_child, &timeout_watcher_child);
                    ev_loop(loop_child,0);
     }
     
     //等待事件
     ev_loop (loop, 0);
     return 0;
   }

2
1
分享到:
评论

相关推荐

    libev的编译安装使用.pdf

    libev的编译安装使用 一、 下载 二、 编译安装 解压文件,进入文件目录。 编译、安装。 三、 编写Demo测试

    使用 libevent 和 libev 提高网络应用性能

    使用 libevent 和 libev 提高网络应用性能

    libev开源库源码

    libev是libevent之后的一个事件驱动的编程框架,其接口和libevent基本类似。官方介绍,其性能比libevent还要高,bug比libevent还少

    libev手册

    libev手册

    libev 手册 libev 分析

    手册

    libev-4.24.tar.gz

    libev4.24下载

    libev 设计分析.pdf

    主要分析libev 的设计架构与算法实现,阅读这篇文章之前,你需要对libev 的使用有大致的了解;libev 提供了 很多watcher 供开发者使用,以下仅对最重要最常用的几个watcher 机制进行分析,从中我们可掌握整个libev 的...

    libev源码和文档

    libev源码和文档

    libev-4.22.tar.gz_libev_libev 下载_libev-4.19.tar.gz_libev-4.22.ta

    libev是高性能事件循环/事件模型的网络库,并且包含大量新特性,除了提供了基本的三大类事件(IO事件、定时器事件、信号事件)支持外还提供了周期事件、子进程事件、文件状态改变事件等多个事件的支持

    libev-4.33.tar.gz

    官网已经无法下载,备份出来分享给大家,libev是libevent之后的一个事件驱动的编程框架

    事件库libev3.7

    本压缩文件包含了libev及其开发文档.该库是一个高效的网络库,也是一个好的调度器.对于每个网络请求,你不必每次都去创建一个线程去处理,这样可能更浪费资源.该库就是为解决这类问题

    libev文档.pdf

    这是 libev 的详细文档,尽管本文档是libev文档,其用法和设计背后的原理方面力求尽可能完善,但它既不是有关基于事件的编程的教程,也不会介绍libev的基于事件的编程。 在本文档中,通常假定读者已经熟悉基于事件的...

    libev-4.15 最新代码

    libev-4.15 最新代码

    高性能网络库——libev手册

    libev是高性能事件循环/事件模型的网络库,并且包含大量新特性。 它是继lievent和Event perl module之后的一套全新网络库。它追求的目标:速度更快,bug更少,特性更多,体积更小。 它和libevent很像,按照作者的...

    c++封装libev

    libev是一个高性能事件循环库,内部封装epoll, 采用c++封装libev,可以快速开发服务端。

    libev-官方手册

    libev是高性能事件循环/事件模型的网络库,并且包含大量新特性。 它是继lievent和Event perl module之后的一套全新网络库。它追求的目标:速度更快,bug更少,特性更多,体积更小。

    qt基于libev的多线程服务端

    qt_eventdispatcher_libev 是基于 libev 的 Qt 事件调度器。 libev是高性能事件循环/事件模型的网络库,并且包含大量新特性。

    libev 监控子进程

    本人经过查阅资料编写的一个简单进程监控demo,其中用到libev库中相关技术,测试时编译运行文件内的代码,他会打印子进程的ID,然后在控制台的kill命令杀死该进程id, 程序会检测到子进程已被杀死,并重新创建子进程。

    libev-4.31.tar.gz

    libev-4.31源码,官网下载,给不方便的小盆友们。 libev是libevent之后的一个事件驱动的编程框架,其接口和libevent基本类似。据官方介绍,其性能比libevent还要高,bug比libevent还少。

    libev代码实例

    libev的一个socket通讯代码实例,有客户端和服务端;

Global site tag (gtag.js) - Google Analytics