在epoll编程中,有三个非常重要的函数:
1. int epoll_create(int size) :创建epoll 句柄, 入参是表示监听的数目是多大。
2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) : 事件注册函数,
@param1:epoll句柄,epoli_create()的返回值,
@param2: 表示注册的行为, 有ADD事件 、MOD事件、DEL事件,
@param3: 注册的fd,在网络编程中,一般为sockfd,
@param4:表示事件类型,
3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout) 等待事件的产生,类似于select() 调用。
在线程池上,之前的博文写过一篇关于线程池的实现,拿来即用即可。造轮子的过程虽然很枯燥也很痛苦,但当你做一个项目用到你造的轮子时还是很有成就感的(菜鸟的成就感~)。
封装的比较简单,后续会完善。
#ifndef _CEVENT_H_
#define _CEVENT_H_
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/epoll.h>
#define MAX_SIZE 1024
enum EventType
{
EOUT = EPOLLOUT, // 写事件
ECLOSE = EPOLLRDHUP, // 对端关闭连接或者写半部
EPRI = EPOLLPRI, // 紧急数据到达
EERR = EPOLLERR, // 错误事件
EET = EPOLLET, // 边缘触发
EDEFULT = EIN | ECLOSE | EERR | EET
};
class CEvent
{
public:
CEvent();
~CEvent();
int Register_event(int fd, EventType type = EDEFULT);
int unRegister_event(int fd);
void* EventHandle(void* arg);
void SetNoblocking(int v_sockfd);
private:
int epfd;
bool is_running;
pthread_t m_tid;
struct events[EPOLL_SIZE];
CThreadPoolProxy *pool;
};
CEvent::CEvent()
{
epfd = epoll_create(MAX_SIZE);
if(epfd == -1)
{
printf("epoll_create failed.");
return -1;
}
pthread_t tid = 0;