Linux epoll API 学习记录

Q:epoll是什么,有哪些接口以及实现什么功能?
A:epoll是SUS标准之外,只在Linux平台上提供的多路复用I/O接口,普遍用于高并发的网络编程,用以代替select/poll,提高并发网络I/O效率。epoll不是一个函数,而是一组函数,由epoll_create、epoll_ctl和epoll_wait组成,包含在sys/epoll.h头文件中。

  • epoll_create:
int epoll_create(int size);

调用此函数内核会产生一个epoll instance数据结构并返回一个文件描述符,这个特殊的描述符就是epoll instance的句柄,后面的两个接口都以它为中心。size参数表示所要监视文件描述符的最大值,不过在目前的Linux版本中已经被弃用(调用的时候不要用0,否则会报invalid argument

  • epoll_ctl:
typedef union epoll_data {
    void *ptr; /* 指向用户自定义数据 */
    int fd; /* 注册的文件描述符 */
    uint32_t u32; /* 32-bit integer */
    uint64_t u64; /* 64-bit integer */
} epoll_data_t;

struct epoll_event {
    uint32_t events; /* 描述epoll事件 */
    epoll_data_t data; /* 见第一个结构体 */
};

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);

对于需要监视的文件描述符集合,epoll API使用interest list进行管理,list中每个成员由描述符值和所要监控的文件描述符指向的文件表项的引用等组成。epoll_ctl就是管理interest list的接口,op参数说明操作类型:

op value meaning
EPOLL_CTL_ADD 向interest list添加一个需要监视的描述符
EPOLL_CTL_DEL 从interest list中删除一个描述符
EPOLL_CTL_MOD 修改interest list中一个描述符

struct epoll_event结构描述一个文件描述符的epoll行为。在使用epoll_wait函数返回处于ready状态的描述符列表时,data域是唯一能给出描述符信息的字段,所以在调用epoll_ctl加入一个需要监测的描述符时,一定要在此域写入描述符相关信息;events域是bit mask,描述一组epoll事件,在epoll_ctl调用中解释为:描述符所期望的epoll事件。常用的事件描述如下:

epoll event meaning
EPOLLIN 描述符处于可读状态
EPOLLOUT 描述符处于可写状态
EPOLLET 将epoll event通知模式设置成edge triggered
EPOLLONESHOT 第一次进行通知,之后不再监测
EPOLLHUP 本端描述符产生一个挂断事件,默认监测事件
EPOLLRDHUP 对端描述符产生一个挂断事件
EPOLLPRI 由带外数据触发
EPOLLERR 描述符产生错误时触发,默认检测事件

EPOLLONESHOT:带有这个标志的描述符,在第一次处于ready状态并被epoll_wait返回之后,内核就会将此描述符标记为inactive状态,之后不会对它进行检测。

  • epoll_wait
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值