Linux epoll 网络通信编程
底层原理:建立e_poll file事件文件,通过e_poll_fd 来管理e_poll,将socket转换成epoll_event ,把epoll_event 放入e_poll file中,通过监听e_poll_fd 来寻找到epoll_event 所对应的socket
建立e_poll file
- epoll_create()
设置对象
- epoll_fd
- epoll_event
添加 epoll_event 到 e_poll file中
- epoll_ctl()
使用epoll file
- epoll_wait()
#include 头文件
epoll_create() 创建epoll
epoll_create(int size)
功能:该函数生成一个epoll专用的文件描述符
size: 预计监听多少事件 随便填
返回值:epoll_fd
对象 epoll_fd / epoll_event
- struct epoll_event
struct epoll_event {
__uint32_t events; //当前事件类型
epoll_data_t data; //操作句柄 epoll_data
};
事件类型有:
EPOLLIN :输入事件;
EPOLLOUT:输出事件;
EPOLLPRI:紧急事件,优先处理;
EPOLLERR:错误事件;
EPOLLHUP:挂起事件;
EPOLLET: 设置为边沿事件,不设置为电频事件;
边沿事件 从0 变 1出发
电频事件 有事件就触发
操作句柄: epoll_data
typedef union epoll_data {
void *ptr;
int fd; // 监听句柄
__uint32_t u32;
__uint64_t u64;
} epoll_data_t; //保存触发事件的某个文件描述符相关的数据
epoll_ctl() 添加epoll_event 函数
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件
- epfd:要添加的 epoll_fd
op:要执行的事件 ,添加,删除,修改
- EPOLL_CTL_ADD 添加
- EPOLL_CTL_MOD 修改
- EPOLL_CTL_DEL 删除
- fd:事件所监听的fd
- epoll_event :添加的 epoll_event
epoll_wait() 启动使用epoll
int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
功能:启动监听epoll
- epfd:要监听的 epoll file
- *epoll_event :返回的 epoll_event
- maxevents:最大事件
- timeout:超时时间
- 返回值,指的是就绪事件的个数