`
simohayha
  • 浏览: 1404175 次
  • 性别: 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
分享到:
评论

相关推荐

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

    本文将详细介绍这两个库的基本原理、使用场景以及如何在实际项目中应用它们来提高网络应用的性能。 #### 处理多个客户端的传统方法及其局限性 在讨论`libevent`和`libev`的具体实现之前,有必要回顾一下传统的处理...

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

    ### 使用 libevent 和 libev 提高网络应用性能的方法 #### 引言 在现代服务器应用程序开发过程中,如何高效地处理成百上千乃至更多的并发事件成为了一项重要挑战。无论是内部请求还是外部网络连接,都需要有效地...

    libumqtt:基于libev的轻量级且完全异步的MQTT客户端C库

    ### libev介绍 `libev`是一个高性能、跨平台的事件库,它提供了非阻塞I/O和定时器等功能,适合开发高度并发的异步应用。`libumqtt`通过`libev`实现了一种事件驱动的模型,使得客户端可以在接收到网络事件时及时做出...

    C++/QT 使用RabbitMQ

    本文将详细介绍如何在C++和QT环境下集成并使用RabbitMQ,以便于开发者构建实时通信和高并发的应用。 首先,安装RabbitMQ需要在系统上设置Erlang环境,因为RabbitMQ是用Erlang语言编写的。确保已下载并安装了Erlang ...

    libhv:与libevent和libuv一样,libhv提供具有非阻塞IO和计时器的事件循环,但API更简单,协议更丰富

    像libevent, libev, and libuv , libhv提供具有非阻塞IO和计时器的事件循环,但具有更简单的api和更丰富的协议。 产品特点 跨平台(Linux,Windows,Mac,Solaris) 事件循环(IO,计时器,空闲) ENABLE_IPV6 ...

    Linux高性能服务器编程,linux高性能服务器编程 pdf,C,C++源码.zip

    书中将详细探讨这些机制的使用,以及如何结合libevent、libev等事件库构建非阻塞I/O服务器。 5. **性能优化**:除了理论知识,书中还会分享实际性能优化的技巧,包括内存管理优化、减少系统调用、避免不必要的拷贝...

    Linux网络编程 pdf 格式

    读者将学会编写简单的服务器程序,处理客户端的请求,并理解异步I/O模型,如select、poll和epoll等机制,以提高网络服务的效率。 第三篇,应用提高篇,进一步深化了网络编程的实践技能。这部分可能涵盖多线程和多...

    《Linux/UNIX网络编程》-甘刚.rar

    10. **异步I/O模型**:如使用libevent或libev等库实现异步事件驱动的网络编程,提高系统吞吐量。 通过阅读这本书,读者不仅可以学习到网络编程的基本概念和技术,还能了解到如何在实际项目中应用这些知识,解决各种...

    网页爬虫-c

    下面将详细介绍如何使用C语言编写一个基础的网页爬虫。 1. **网络编程基础**: 在C语言中进行网络编程主要依赖于`socket`接口,这是TCP/IP协议族的一部分,允许程序创建和管理网络连接。你需要理解以下概念: - `...

    gevent-21.12.0-cp310-cp310-win_amd64.whl.zip

    3. **I/O非阻塞化**:gevent使用libev作为底层事件库,可以对网络I/O(如socket)进行非阻塞处理。当进行网络通信时,如果数据未准备好,gevent不会挂起进程,而是切换到其他协程继续执行。 4. **超时与定时器**:...

    Win7 (64) py-gevent模块

    其中,`gevent`是一个非常重要的库,它是一个基于libev事件库的Python网络编程库,通过greenlet实现了高效的协程(coroutine)模型,使得编写高并发、非阻塞的网络服务变得简单易行。本文将详细介绍在Win7 64位系统...

    curl-7.32.0.7z

    本文将详细介绍libcurl的功能、使用方法以及其在VS环境中的编译过程。 libcurl是一个用C语言编写的支持多种网络协议的库,如HTTP、HTTPS、FTP、FTPS等,甚至包括SMTP、POP3、IMAP等邮件协议。它的核心目标是为...

    nodeJS.pdf

    此外,文档还涉及到了Node.js的安装过程、基本使用方法及一些关键API的介绍。 #### 标签:NodeJS.pdf 该标签强调了文档的主题是关于Node.js的学习资料,涵盖了Node.js的核心概念和技术要点。 #### 部分内容概览:...

    mongols 文档手册.pdf

    根据提供的文档信息,我们可以归纳并深入探讨mongols的相关知识点,主要涵盖其介绍、安装方法、TCP服务器使用方式等几个方面。 ### mongols简介 #### C++ Mongols简介 Mongols是一个高性能的C++网络库,它不依赖于...

    linux 网络编程

    书里会介绍如何使用SSL/TLS进行加密通信,防止中间人攻击,以及如何实施认证和授权策略以保护网络资源。 最后,书中的实例代码将帮助读者更好地理解和实践所学内容。通过分析和修改这些代码,你可以亲身体验到Linux...

    em-websocket-master

    README.txt 文件通常包含了项目的介绍、安装指南、使用方法以及可能的贡献者信息等。em-websocket-master 文件可能是项目的源代码或者配置文件,这部分需要打开文件内容才能详细解读。 详细知识点: 1. **...

    python Gevent程序员指南.pdf

    - **简单 Server**:使用 Gevent 构建简单的 HTTP 或其他类型的服务器。 - **WSGI Servers**:通过 Gevent 实现 WSGI 规范的服务器,可以处理大量的并发连接。 - **流式 Server**:支持流媒体传输的服务器。 - **...

    计算机网络高级软件编程技术随书光盘内容

    4. **异步IO与事件驱动编程**:介绍非阻塞IO、I/O复用(如select、poll、epoll)和事件驱动编程(如事件循环和回调函数),这些技术能有效提升服务器处理大量并发请求的能力。 5. **HTTP协议详解**:作为最广泛使用...

    C 定时器实现

    - 考虑使用异步I/O或事件驱动编程模型(如libevent、libev、libuv等),以提高处理大量并发定时器的效率。 综上所述,基于RBTree和域套接字的C语言定时器实现提供了一种高效且可扩展的多线程定时解决方案。通过...

    开源代码网站.docx

    - **简介**:一个简单的网站压力测试工具,使用C语言编写。 - **特色**:代码简洁(总共不到600行),易于理解和学习。 - **学习价值**:了解网络服务器的性能测试原理,掌握C语言的基础语法。 2. **Tinyhttpd**...

Global site tag (gtag.js) - Google Analytics