1.select的缺点:
1.select监听的文件描述符集合是一个数组,有上限(1024个)
2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销
3.select需要用户手动查找产生事件的文件描述符
4.select只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)
2.poll
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
功能:
监听文件描述符集合,工作方式类似于select
参数:
fds:文件描述符集合首地址
nfds:文件描述符集合的数组的长度
timeout:超时时间,单位毫秒,-1表示永久等待
返回值:
成功返回产生事件文件描述符个数
失败返回-1
超时仍然没有产生的事件返回0
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
1.poll的缺点:
1.poll监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销
2.poll需要用户手动查找产生事件的文件描述符
3.poll只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)
3.epoll
1.epoll_create
int epoll_create(int size);
功能:
在内核层创建一张epoll监听的事件表
参数:
size:监听的事件表大小
返回值:
成功返回新的文件描述符
失败返回-1
2.epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:
管理内核中epoll事件表
参数:
epfd:文件描述符
op: EPOLL_CTL_ADD 添加客户端
EPOLL_CTL_MOD 修改客户端
EPOLL_CTL_DEL 删除客户端
fd:文件描述符
event:事件结构体
返回值:
成功返回0
失败返回-1
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 EPOLLOUT EPOLLET
3.epoll_wait
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
功能:
监听epfd对应的事件表中是否有事件发生
参数:
epfd:文件描述符
events:存放产生事件的数组空间首地址
maxevents:最多存放数组元素个数
timeout:超时时间,单位毫秒,-1表示永久等待
返回值:
成功返回实际发生事件的个数
失败返回-1
超时仍然没有产生事件返回0
epoll的优点:
1.epoll没有文件描述符上限限制
2.epoll监听的事件表在内核层,内核监听事件不需要操作用户层空间提高效率
3.epoll会获得产生事件的文件描述符,不需要用户查找
4.epoll可以工作在边沿触发模式(高速模式),提高效率