epoll详解

来源:互联网 发布:linux 效率 编辑:程序博客网 时间:2024/05/16 14:20

linux 并发编程 epoll详解

epoll 是linux 2.6内核提供的实现多路并发处理的关键技术,其功能强大但使用简单。
epoll的使用主要有3个函数:
epoll_create( );
epoll_ctl( );
epoll_wait( );
下面详细讲解这3个方法的用法。
这里写图片描述
epoll_create(int size)只有一个参数size,为大于0的任何数都可,并不表示epoll的实际大小。返回一个epoll实例的描述符。之后我们就可以用这个描述符来对epoll实例进行操作了。


这里是epoll_ctl的定义
各参数含义:
epfd 就是epoll_create所返回的描述符;
op是我们要对目标描述符fd做什么操作,有三种可选操作:EPOLL_CTL_ADD(向epfd中注册fd);EPOLL_CTL_MOD(修改fd 的event);EPOLL_CTL_DEL(从epfd中删除fd);
fd 就是我们要对那个描述符做操作,fd可以是任何文件描述符,管道,套接字等。
events 我们首先看下这个结构体的定义这里是epoll_ctl的定义
epoll_event有两个成员,events表示定义的事件,常用的有如下几种:EPOLLIN(可读),EPOLLOUT(可写),EPOLLET(边缘触发)什么是边缘触发?下次再讲。默认是水平触发(EPOLLLT),什么是水平触发?下次吧。
data是附加数据,可以记录一些有用数据,比如我们通常把fd放入data。


当我们把一些fd注册进入epoll实例之后,我们就可以用epoll_wait( )来监视各个描述符的状态的变化了。
这里是epoll_wait的定义
各参数的含义:
epfd 还是那个epoll描述符;
events就是我们之前讲的的events,一般我们会定义一个struct epoll_event events[ ],这个数组里用来存放多个fd 的事件;
manevents即我们定义的数组的大小;
timeout 是超时时间,具体设置如下这里是epoll_wait的定义
timeout=n, n>0时epoll_wait( )会等待在n秒之内如果有事件发生则放回,否则等待直到超时返回0。n=-1, epoll_wait()会阻塞直到有事件发生才返回。n=0,立刻返回。
epoll_wait( )返回发生状态变化的描述符的个数,然后我们可以循环 去处理每个发生变化的描述符。通常服务器端使用情形如下:
while(1)
{
nfds=epoll_wait(epfd,events,101,-1);
int i=0;
for(i=0;i<nfds;i++)
{
这里分别对每个描述符进行处理
}

详细的使用示例代码我将会在下一篇博客“epoll并发服务器里”讲解

1 0
原创粉丝点击