libev是一个**事件驱动库**,它需要循环探测事件是否发生,在Linux上实际是封装了epoll等系统调用。

其循环过程由ev_loop( )函数设置,循环体是ev_loop结构。

//创建事件循环
void ev_loop( ev_loop* loop, int flags )

libev支持多种事件类型,常用的如I/O,定时器,信号等。详细的可以去看官网教程的WATCHER TYPES章节。

每种事件都有具体结构来表示,如ev_io表示一个I/O事件。事件通过ev_io_init()函数初始化。

//初始化一个事件
void ev_io_init(ev_io *io, callback, int fd, int events)

初始化内容包括了,探测的fd,事件类型,回调函数等。如初始化一个fdx的可读事件:


ev_io_init(accept_event, acceept_callback, fdx, EV_READ);

普通网络程序中,一般阻塞在accept(socket_fd),在连接到达后返回一个connect_fd继续等待。而事件驱动模型中,则变为探测socket_fd是否可读。在callback回调中去执行accept,不再阻塞。

现在我们要做的只是将初始化好的accept_event这个事件加入到事件循环中去。

将事件添加到事件循环,或将事件从事件循环删去,是通过ev_io_start()和ev_io_stop函数完成(这里示例I/O事件):

void ev_io_start( ev_loop *loop, ev_io* io )
void ev_io_stop( EV_A_* )

虽然很多细节未考虑,但一个简单的事件驱动的服务器模型已经有了。其中屏蔽了很多裸写epoll要处理的细节。

简单总结下步骤:

1、创建一个事件循环

struct ev_loop *loop = EV_DEFAULT;

2、初始化一个待探测的事件,这个事件由fd(I/O为例),回调函数,事件类型(读/写)等组成

ev_io stdin_watcher;

ev_io_init (&stdin_watcher, callback, /*STDIN_FILENO*/ 0, EV_READ);

3、将事件加入到事件循环

ev_io_start (loop, &stdin_watcher);

4、启动事件循环

ev_run (loop, 0);

我们可以随时向事件循环中加入事件,或从中删除某事件。

完整示例:

   // a single header file is required
#include <ev.h> #include <stdio.h> // for puts // every watcher type has its own typedef'd struct
// with the name ev_TYPE
ev_io stdin_watcher;
ev_timer timeout_watcher; // all watcher callbacks have a similar signature
// this callback is called when data is readable on stdin
static void
stdin_cb (EV_P_ ev_io *w, int revents)
{
puts ("stdin ready");
// for one-shot events, one must manually stop the watcher
// with its corresponding stop function.
ev_io_stop (EV_A_ w); // this causes all nested ev_run's to stop iterating
ev_break (EV_A_ EVBREAK_ALL);
} // another callback, this time for a time-out
static void
timeout_cb (EV_P_ ev_timer *w, int revents)
{
puts ("timeout");
// this causes the innermost ev_run to stop iterating
ev_break (EV_A_ EVBREAK_ONE);
} int
main (void)
{
// use the default event loop unless you have special needs
struct ev_loop *loop = EV_DEFAULT; // initialise an io watcher, then start it
// this one will watch for stdin to become readable
ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ , EV_READ);
ev_io_start (loop, &stdin_watcher); // initialise a timer watcher, then start it
// simple non-repeating 5.5 second timeout
ev_timer_init (&timeout_watcher, timeout_cb, 5.5, .);
ev_timer_start (loop, &timeout_watcher); // now wait for events to arrive
ev_run (loop, ); // break was called, so exit
return ;
}

libev的更多相关文章

  1. [译]libev和libevent的设计差异

    本文译自what's the difference between libev and libevent? 作者是libev作者 [问]两个库都是为异步io调度而设计,在Linux上都是使用epoll ...

  2. CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()

    在CentOS Release 6.6安装percona-xtrabackup-2.3.4时,遇到下面错误信息 rpm -ivh percona-xtrabackup-2.3.4-1.el6.x86_ ...

  3. libev学习(一)

    一.libev简介 Libev是一个事件循环:你注册感兴趣的特定事件(比如一个文件可以读取时或者发生超时时),它将管理这些事件源,将这些事件反馈给你的程序.为了实现这些,至少要在你的进程(或线程)中执 ...

  4. libev安装与示例程序编译运行

    Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...

  5. 001.libev安装及eclipse下添加libev库链接

    libev库安装: 1.下载页面:http://dist.schmorp.de/libev/ 当前版本下载: [root@mid_server ~]# cd /usr/local/src  [root ...

  6. libev 宏展开

    想看源码,宏太多,看着累,宏展开,再看,功力时间不够,先放下 放上宏展开后的代码. libev4.20 展开方示为 ./configure 修改makefile文件,字符串 替换CC为 CPP 注意要 ...

  7. libev代码

    就是贴上来: ev.c: /* * libev event processing core, watcher management */ /* this big block deduces confi ...

  8. 使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史

    构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作. 有许多解决方案,但事件驱动也被广泛应用到网络编程中.并大规模部署在高 ...

  9. libev笔记

    libev是一个开源库,实现了一个reactor模式事件驱动任务调度库.代码非常精简,包含所有实现的.c文件只有不到5000行. 支持的事件类型: ev_io ev_timer ev_periodic ...

  10. 练习-libev和pyev示例

    事件循环,IO复用,还是理解深刻一点好. 比较LIBEV和PYEV,发现PYTHON库只是对LIBEV作了简单的语法转换. 到了这个层次,就一个字:DIAO!!! libev的C版: #include ...

随机推荐

  1. 【Linux】shell学习之sed

    sed替换命令 使用该命令,可以将特定字符串或匹配的规则表达式用另一个字符串替换. sed 's/88/--/' filename 将filename每行第一次出现的88用字符串--替换,然后将该文件 ...

  2. [vjudge contest15(xjoi)] C - Berzerk

    CodeForces - 787C Rick and Morty are playing their own version of Berzerk (which has nothing in comm ...

  3. oracle in 函数

    IN操作符      select * from scott.emp where empno=7369 or empno=7566 or empno=7788 or empno=9999:      ...

  4. 从tcp的角度看,打开一个网页到底发生了什么

    使用wireshark进行抓包分析:新建表达式过滤器,选择协议,字段,匹配方式,应用就能筛选出想要的数据包. 一个示例:(tcp.srcport == 1523 or tcp.dstport == 1 ...

  5. RCNN 目标识别基本原理

    RCNN- 将CNN引入目标检测的开山之作 from:https://zhuanlan.zhihu.com/p/23006190 前面一直在写传统机器学习.从本篇开始写一写 深度学习的内容. 可能需要 ...

  6. Weblogic禁用SSLv3和RC4算法教程

    weblogic在启用https时一样会报同WebSphere那样的一SSL类漏洞,中间件修复这些漏洞原理上来说是一样的,只是在具体操作上有着较大的区别. 1. weblogic禁用SSLv3算法 编 ...

  7. codeigniter在nginx下返回404 not found

    codeigniter框架需要path_info的支持,Apache默认支持path_info,但是nginx默认不支持,我们需要设置nginx,使得nginx支持path_info 网上试了好多方法 ...

  8. laravel管理员表中的模型

    <?php namespace App; use App\Model; use Illuminate\Foundation\Auth\User as Authenticatable; class ...

  9. Win10系列:VC++ Direct3D图形绘制1

    通过前面的介绍,相信读者已经了解了如何新建一个用于开发Direct3D应用程序的项目模版,以及这个项目模版中用于绘制立体图形的主要函数.在本小节中,将通过一个具体的示例来介绍如何使用Visual St ...

  10. Win10系列:VC++绘制几何图形5

    打开D2DBasicAnimation.h头文件,并在D2DBasicAnimation类中添加如下的代码: private:     //声明成员变量point     D2D1_POINT_2F ...