linux网络编程|I/O复用:epoll系统调用(代码部分:待补充)

epoll

———————————————————————————————————

内核事件表

epoll是Linux特有的I/O复用函数。它在实现和使用上与select、 poll有很大差异。首先,epoll使用一组函数(函数簇)来完成任务,而不是单个函数;epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而不用像select和poll那样每次调用都要重复传入文件描述符集或事件集;但是 epoll 需要使用一个额外的文件描述符来唯一标识内核中的这个事件表。这个文件描述符使用下面的 epoll_create 函数来创建:

#include <sys/epoll.h>
int epoll_create(int size);//创建一个内核事件表,存储用户关注的文件描述符及其上的事件类型

注意:size参数现在并不起作用,只是给内核一个提示,告诉它事件表需要多大。该函数返回的文件描述符将用作其它所有epoll系统调用的第一个参数,以指定要访问的内核事件表
操作epoll的内核事件表函数是:

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *events);//管理内核事件表,添加、删除、修改操作。

fd参数是要操作的文件描述符,op参数则指定操作类型,操作类型有如下3种:
(1)EPOLL_CTL_ADD,往事件表中注册fd上的事件;
(2)EPOLL_CTL_MOD,修改fd上的注册事件;
(3)EPOLL_CTL_DEL,删除fd上的注册事件。

event参数指定事件,它是 epoll_event 结构指针类型,epoll_event的定义是:

struct epoll_event 
{
	short   events;      //Epoll事件类型--->EPOLLIN
	epoll_data_t data;        //用户数据 ------->EPOLLRDHUP
};

其中:
(1)events成员描述事件类型。epoll支持的事件类型和poll基本相同。表示epoll事件类型的宏是在poll对应的宏前加上“E”,比如epoll的数据可读事件是EPOLLIN;但是,epoll有两个额外的事件类型——EPOLLET 和 EPOLLONESHOT,它们对于epoll的高效运作非常关键!
(2)data成员用于存储用户数据,其类型 epoll_data_t 的定义如下:

typedef union epoll_data
{
	void* ptr;
	int fd;
	uint32_t u32;
	uint64_t u64;
}epoll_data_t;

epoll_data 是一个联合体,其4个成员中使用最多的是fd,它指定事件所从属的目标文件描述符;ptr成员可用来指定与fd相关的用户数据,但由于 epoll_data_t 是一个联合体,我们不能同时使用其 ptr 成员和 fd 成员,因此,如果要将文件描述符和用户数据关联起来,以实现快速的数据访问,只能使用其他手段。例如不使用epoll_data_t 的 fd成员,而在ptr指向的用户数据中包含fd

epoll_ctl 成功时返回0,失败则返回 -1 并设置 errno。
———————————————————————————————————

epoll_wait函数

epoll系列系统调用的主要接口是epoll_wait函数。它在一段超时时间内等待一组文件描述符上的事件,其函数原型如下:

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, 
                   int timeout);

其中:
(1)maxevents参数指定最多监听多少个事件,它必须大于0;
(2)timeout参数的含义与poll接口的timeout参数相同;

划重点:
epoll_wait 函数如果检测到事件,就将所有就绪的事件从内核事件表(由epfd参数指定)中复制到它的第二个参数events指向的数组中,这个数组只用于输出epoll_wait检测到的就绪事件。而不像select和poll的数组参数那样既用于传入用户注册的事件,又用于输出内核检测到的就绪事件,这就极大地提高了应用程序索引就绪文件描述符的效率。
epoll_wait 成功时返回就绪的文件描述符的个数,失败时返回 -1 并设置ermo
———————————————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值