头文件:#include <sys/epoll.h>
一.eopll相关的函数:
1.int epoll_create(int size);
返回一个epoll句柄,参数size是可监听的最大个数
2.int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数一epfd是epoll_create()出来到句柄。
参数二op可以取三个宏中到其一:
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
参数三fd是要监听的fd。
参数四event是设置监听到模式(ET模式,LT模式,write事件,read事件,accept事件)
相关结构体如下:
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 :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。
epoll_event.data.fd是要监听到fd,一般设置epoll_event.data.fd和epoll_event.events就足够了。
3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
返回值是触发事件到个数,如返回0表示已超时。
参数一epfd是epoll_create()出来到句柄。
参数二events是一个epoll_event类型的数组。
参数三maxevents的值不能大于创建epoll_create()时的size。
参数四timeout是超时时间(毫秒,0会立即返回,-1将不确定,永久阻塞)。
4.close(int fd)
关闭句柄。
参考:
blog.csdn.net/ljx0305/article/details/4065058
http://www.cnblogs.com/aicro/archive/2012/12/27/2836170.html
http://blog.csdn.net/dodo_check/article/details/8553265