zoukankan      html  css  js  c++  java
  • 4、epoll函数

    1、常用函数

        有:epoll_createepoll_ctlepoll_waitLinux-2.6.19又引入了可以屏蔽指定信号的epoll_wait: epoll_pwait。至此epoll家族已全。其中epoll_create用来创建一个epoll文件描述符,epoll_ctl用来添加/修改/删除需要侦听的文件描述符及其事件,epoll_wait/epoll_pwait接收发生在被侦听的描述符上的,用户感兴趣的IO事件。epoll文件描述符用完后,直接用close关闭即可,非常方便。事实上,任何被侦听的文件符只要其被关闭,那么它也会自动从被侦听的文件描述符集合中删除,很是智能。

    每次添加/修改/删除被侦听文件描述符都需要调用epoll_ctl,所以要尽量少地调用epoll_ctl,防止其所引来的开销抵消其带来的好处。有的时候,应用中可能存在大量的短连接(比如说Web服务器),epoll_ctl将被频繁地调用,可能成为这个系统的瓶颈。

    2、函数简介

    #include <sys/epoll.h>

    1)创建

    int epoll_create(int size);

    创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大,内核2.6.8后没有意义,大于0即可。注意,select()中的第一个参数,是给出最大监听的fd+1的值。当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。

    2)注册

    int epoll_ctl(int epfd, int opint fdstruct epoll_event *event)

    epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:

    EPOLL_CTL_ADD:注册新的fdepfd中;

    EPOLL_CTL_MOD:修改已经注册的fd的监听事件;

    EPOLL_CTL_DEL:从epfd中删除一个fd

    第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:

    typedef union epoll_data {

        void *ptr;

        int fd;

        __uint32_t u32;

        __uint64_t u64;

    } epoll_data_t;

    struct epoll_event {

      __uint32_t events;  /* Epoll events */

      epoll_data_t data;  /* User data variable */

    };

    3)等待事件的发生

    int epoll_wait(int epfd,struct epoll_event * eventsint maxeventsint timeout)

    等待事件的产生,类似于select()调用。events:返回的epoll事件的数组;maxevent:每次能处理的事件数;

    timeout:超时值,以毫秒计;-1表示无限期等待

    返回值

    >0:事件个数

    =0:超时

    -1:出错

    再执行该函数成功后,进行连接处理过程中,来的新的连接请求,将加入下一次处理的集合中。

        在许多测试中我们会看到如果没有大量的idle-connection或者dead-connectionepoll的效率并不会比select/poll高很多,但是当我们遇到大量的idle-connection(例如WAN环境中存在大量的慢速连接),就会发现epoll的效率大大高于select/poll

  • 相关阅读:
    C++ template —— 模板中的名称(三)
    关于烂代码的那些事(下)
    关于烂代码的那些事(中)
    关于烂代码的那些事(上)
    比尔的村庄:创业是选择做赚钱的事,还是值钱的事?
    C++ template —— 深入模板基础(二)
    依赖倒置,控制反转,依赖注入
    JAVA中限制接口流量、并发的方法
    SVN同步时忽略特定文件或文件夹
    MySQL中查询表及索引大小的方法
  • 原文地址:https://www.cnblogs.com/mydomain/p/2163275.html
Copyright © 2011-2022 走看看