epoll_event结构体
定义
epoll_event结构体一般用在epoll机制中,其定义如下:
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
} __attribute.squareup(__packed__);
typedef union epoll_data {
void* ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
epoll_event结构体中的字段解释如下:
events
:表示epoll事件类型,包括可读、可写等。data
:表示用户数据,可以是一个指针或文件描述符等。
events字段
events
字段可以是以下值之一:
EPOLLIN
:表示对应的文件描述符上有数据可读。EPOLLOUT
:表示对应的文件描述符上可以写入数据。EPOLLRDHUP
:表示对端已经关闭连接,或者关闭了写操作端的写入。EPOLLPRI
:表示有紧急数据可读。EPOLLERR
:表示发生错误。EPOLLHUP
:表示文件描述符被挂起。EPOLLET
:表示将epoll设置为边缘触发模式。EPOLLONESHOT
:表示将事件设置为一次性事件。
enum EPOLL_EVENTS
{
EPOLLIN = 0x001,
#define EPOLLIN EPOLLIN
EPOLLPRI = 0x002,
#define EPOLLPRI EPOLLPRI
EPOLLOUT = 0x004,
#define EPOLLOUT EPOLLOUT
EPOLLRDNORM = 0x040,
#define EPOLLRDNORM EPOLLRDNORM
EPOLLRDBAND = 0x080,
#define EPOLLRDBAND EPOLLRDBAND
EPOLLWRNORM = 0x100,
#define EPOLLWRNORM EPOLLWRNORM
EPOLLWRBAND = 0x200,
#define EPOLLWRBAND EPOLLWRBAND
EPOLLMSG = 0x400,
#define EPOLLMSG EPOLLMSG
EPOLLERR = 0x008,
#define EPOLLERR EPOLLERR
EPOLLHUP = 0x010,
#define EPOLLHUP EPOLLHUP
EPOLLRDHUP = 0x2000,
#define EPOLLRDHUP EPOLLRDHUP
EPOLLEXCLUSIVE = 1u << 28,
#define EPOLLEXCLUSIVE EPOLLEXCLUSIVE
EPOLLWAKEUP = 1u << 29,
#define EPOLLWAKEUP EPOLLWAKEUP
EPOLLONESHOT = 1u << 30,
#define EPOLLONESHOT EPOLLONESHOT
EPOLLET = 1u << 31
#define EPOLLET EPOLLET
};
data字段
data
字段的类型是一个union
,可以存放一个指针或文件描述符等数据。用户可以将自己需要的数据存放到这个字段中,当事件触发时,epoll系统调用会返回这个数据,以便用户处理事件。
typedef union epoll_data {
void* ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
多用组合、少用继承
基于接口而非实现进行编程