一、epoll提供的接口
1、epoll_create
接口声明:int epoll_create(int size)
接口功能:创建一个epoll对象,用来管理需要监控的fd
接口参数:需要监控的fd个数,这个值是在创建epoll对象时进行初始化会使用到,如果监控的fd超过这个值会动态的扩展,实际使用时传一个非负整数就可以
返回值:
1)success:返回epoll对象句柄
2)failure:-1
2、epoll_ctl
接口声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event)
接口功能:epoll的事件注册函数,注册要监控的事件类型
接口参数:
1)epfd:epoll句柄
2)op:表示动作,使用下面的三个宏表示
EPOLL_CTL_ADD:注册新的fd到epfd中
EPOLL_CTL_MOD:修改已经注册的fd的监听事件
EPOLL_CTL_DEL:从epfd中删除一个fd
3)fd:需要监控的fd
4)event:通知内核需要监控的事件,事件可以是下面几种类型的事件
EPOLLIN :表示链接可以读(tcp链接远端主动关闭连接,也是可读事件,因为需要处理发送过来的FIN包对应的就是read返回0)
EPOLLOUT:表示链接可以写数据
EPOLLPRI:表示链接有紧急的数据可读(这里应该表示有带外数据到来)
EPOLLERR:表示链接发生错误
EPOLLHUP:表示链接被挂断
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,默认是水平模式(Level Triggered)
EPOLLRDHUP:表示tcp连接的远端关闭或半关闭链接
返回值:
1)success:返回值为0,表示事件注册成功
2)failure:返回值-1,表示事件注册失败
3、epoll_wait
接口声明:int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
接口功能:接收就绪队列中的事件,并把数据从内核态拷贝到用户态
接口参数:
1)epfd:epoll句柄
2)events:用户用来接收数据的缓存
3)maxevents:第二个参数是一个数组,这个参数标识数组的大小
4)timeout:超时时间,如果值为-1则一直等待。epoll_wait是一个阻塞接口,当就绪队列中有事件时,这个接口会被触发
返回值:
1)success:返回值为正整数,表示处于就绪状态的链接个数
2)failure:返回值-1
4、示例
#include <stdio.h>
#include <unistd.h>
#include <sys/epoll.h>int main(void)
{int epfd, nfds;struct epoll_event ev, events[5]; // ev用于注册事件,数组用于返回要处理的事件epfd = epoll_create(1); // 只需要监听一个描述符——标准输入ev.data.fd = STDOUT_FILENO;ev.events = EPOLLOUT | EPOLLET; // 监听写状态同时设置ET模式epoll_ctl(epfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev); // 注册epoll事件for (;;) {nfds = epoll_wait(epfd, events, 5, -1);for (int i = 0; i < nfds; i++) {if (events[i].data.fd == STDOUT_FILENO) {printf("welcome to epoll's word!\n");}}}return 0;
}