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

原文地址:https://www.cnblogs.com/mydomain/p/2163275.html