[db:标题]
摘要:多路io- epoll 4-1简介 它是linux中内核实现io多路转接复用的一个实现。(epoll不可跨平台,只能用于Linux)io多路转接是指在同一个操作里,同时监听多个输入输出源,在其中一个或多个输入输出源可用时范慧慧这个源,
多路io- epoll
4-1简介
它是linux中内核实现io多路/转接复用的一个实现。(epoll不可跨平台,只能用于Linux)io多路转接是指在同一个操作里,同时监听多个输入输出源,在其中一个或多个输入输出源可用时范慧慧这个源,然后对其进行操作。
epoll采用红黑树来管理待检测的集合,而poll和select都是以线性的方式进行管理。随着集合的增大,select和poll的检测速度会逐渐变慢,而epoll凭着红黑树的性质使得自己不会慢很多,所以使用epoll效率高。
select和poll在工作过程中会对内核/用户空间数据进行拷贝。而在epoll中,内核和用户区使用的是共享内存,省去了没有必要的拷贝。
epoll会直接返回那些文件描述符是已经准备就绪的,而select和poll则需要我们自己想办法判断。
epoll没有最大文件描述符的限制,仅受系统可以打开多少文件描述符的限制。
当多路复用的文件数量庞大,io操作频繁时,可使用epoll。
4-2 epoll的相关函数
头文件:#include <sys/epoll>
epoll_create函数:
函数原型:int epoll_create(int size);
函数功能:创建一个红黑树模型实例,用于管理待检测的文件描述符集合。
函数参数:
size:这个参数在Linux内核2.6.8版本以后,这个参数是被忽略的,只需要指定一个大于0的数值即可。
函数返回值:
成功:返回一个有效的文件描述符,通过它就可以访问创建的epoll实例了。
失败:返回-1
epoll_ctl函数:
函数原型:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
函数功能:用于管理红黑树上的结点,可以进行添加,删除,修改等操作。
函数参数:
epfd:这个是epoll_create返回的文件描述符,通过它找到对应的epoll实例。
op:这是一个枚举值,控制通过该函数执行什么操作
EPOLL_CTL_ADD:往epoll模型中添加新的节点。
EPOLL_CTL_MOD:修改epoll模型中已经存在的节点。
EPOLL_CTL_DEL:删除epoll模型中的指定的节点。
fd:填要添加/修改/删除的文件描述符。
event:epoll事件,用来修饰第三个参数对应的文件描述符,指定检测这个文件描述符的某些事情。
EPOLLIN:读事件,接收数据,如果检测到读缓冲区有动静,代表该文件描述符就绪。
EPOLLOUT:写事件,发送数据,如果检测到写缓冲区有动静,代表该文件描述符就绪。
EPOLLERR:异常事件。
data:用户数据变量,这是一个联合体类型,通常情况下使用里边的fd成员,用于存储待检测的文件描述符的值,在调用epoll_wait()函数的时候这个值会被传出。
函数返回值:
成功:返回0
失败:返回-1
结构体struct epoll_event的成员:
uin32_t events:监听的事件类型
epoll_data_t data它是一个epoll_data共用体,代表用户数据
共用体epoll_data:
void *ptr:存储一个指针
int fd:存储一个文件描述符
uint32_t u32:存储一个32位无符号整数
uint64_t u64:存储一个42位无符号整数
epoll_wait函数:
函数原型:int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout):
函数功能:检测创建的epoll实例中有没有就绪的文件描述符。
函数参数:
epfd:填epoll_create函数的返回值,通过它找到对应的epoll实例。
events:传出参数,一个结构体数组地址,里面存储了已就绪的文件描述符信息。
