Linux杂谈:Epoll简介
Posted Stoneshen1211
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux杂谈:Epoll简介相关的知识,希望对你有一定的参考价值。
文章目录
在前面简单介绍了select的使用方法,但是select也有一些缺点,因此2.6内核引入了epoll,优化了select的性能问题。
1 epoll_create
函数原型:
#include <sys/epoll.h>
int epoll_create(int size);
此函数用来创建一个epoll的句柄,size用于告诉内核需要监听的数目一共有多大。
2 epoll_ctl
函数原型:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数:
2.1 epfd
为epoll_create的返回值
2.2 op
表示动作,主要有以下三个宏:
EPOLL_CTL_ADD 注册新的文件描述符到edfd中去
EPOLL_CTL_MOD 修改文件描述符event信息
EPOLL_CTL_DEL 从edfd中删除注册的文件描述符
2.3 event
event结构体包含了此文件描述符需要监听的事件以及用户私有数据,结构体如下:
typedef union epoll_data
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
epoll_data_t;
struct epoll_event
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
;
上面的events表示要监听的事件,主要有以下几个值:
EPOLLIN 可读
EPOLLOUT 可写
EPOLLRDHUP 对端断开连接
EPOLLPRI 有紧急数据要读
EPOLLERR 出错
EPOLLHUP 文件被挂起
EPOLLET 设置为边缘触发模式,默认水平触发模式
EPOLLONESHOT(Linux 2.6.2以上版本)只监听一次事件,当需要再次监听时,需要重新加入epoll中,使用EPOLL_CTL_MOD添加新的事件
data为用户私有的数据,可以在里面填充自己需要的数据,当有事件触发时,返回的events也会携带同样的数据。
3 epoll_wait
函数原型:
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
3.1 epfd
为epoll_create的返回值。
3.2 events
表示从内核得到的事件的集合,当监听到事件之后,会将对应的信息赋值给events并返回。
3.3 maxevents
最大的events事件数量。
3.4 timeout
超时时间,单位ms
4 示例
int test()
int s32EventsMax = 10;
int s32FD1 = 17; //文件描述符1 此处demo写为固定值
int s32FD2 = 18; //文件描述符2 此处demo写为固定值
struct epoll_event stEv;
struct epoll_event stEvents[s32EventsMax];
int s32EpollFd = 0;
int s32FdsNum = 0;
int i = 0;
s32EpollFd = epoll_create(s32EventsMax); //创建句柄
if (s32EpollFd == -1)
printf("epoll_create \\n");
return -1;
stEv.events = EPOLLIN; //可读
stEv.data.fd = s32FD1;
if (epoll_ctl(s32EpollFd, EPOLL_CTL_ADD, s32FD1, &ev) == -1)
printf("epoll_ctl: s32FD1\\n");
return -1;
stEv.events = EPOLLIN; //可读
stEv.data.fd = s32FD2;
if (epoll_ctl(s32EpollFd, EPOLL_CTL_ADD, s32FD2, &ev) == -1)
printf("epoll_ctl: s32FD2\\n");
return -1;
while(1)
s32FdsNum = epoll_wait(s32EpollFd, stEvents, s32EventsMax, -1);
if (s32FdsNum == -1)
printf("epoll_wait\\n");
return -1;
for (i = 0; i < nfds; ++i)
if (stEvents[n].data.fd == s32FD1)
//do something...
else if (stEvents[n].data.fd == s32FD2)
//do something...
return 0;
以上是关于Linux杂谈:Epoll简介的主要内容,如果未能解决你的问题,请参考以下文章