epoll

epoll

  epoll是一个比select模型更高效的异步模型,select一次查询需要O(N),epoll需要O(1),因为epoll可以直接获得结果,而select需要用所有当前的fd去readable fd set中检察。epoll很简单,推荐使用libevent,epoll只在linux下有效,libevent提供了统一的接口,内部使用各个平台独有的设施来完成功能。 

int epoll_create(int size);



int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);



EPOLL_CTL_ADD    //注册新的fd到epfd中;

EPOLL_CTL_MOD    //修改已经注册的fd的监听事件;

EPOLL_CTL_DEL    //从epfd中删除一个fd;



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 */

};



EPOLLIN     //表示对应的文件描述符可以读(包括对端SOCKET正常关闭);

EPOLLOUT    //表示对应的文件描述符可以写;

EPOLLPRI    //表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);

EPOLLERR    //表示对应的文件描述符发生错误;

EPOLLHUP    //表示对应的文件描述符被挂断;

EPOLLET     //将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。

EPOLLONESHOT//只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。



int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

  参考:http://www.cnblogs.com/haippy/archive/2012/01/09/2317269.html

你可能感兴趣的:(epoll)