1、select的些许缺点
回忆一下 select接口
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
select需要我们指定文件描述符的最大值,然后取[0,nfds)这个范围内的值查看是在集合readfds,writefds或execptfds中,也就是说这个范围内存在一些不是我们感兴趣的文件描述符,cpu做了一些无用功,poll对她进行了改进,下面就看看poll是怎么做的。
2、poll接口
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
跟select不同的是,poll不再告知内核一个范围,而是通过struct pollfd结构体数组精确的告知内核用户关心哪些文件描述符(流)。参数nfds指示结构体数组的大小。timeout表示程序员的忍耐度,有三种取值:
- 0,poll函数不阻塞
- 整数,阻塞timeout时间
- 负数,无限阻塞
下面来看一下struct pollfd结构体,以及其中的事件有哪些取值,及其含义
struct pollfd {
int fd; /* an open file file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
- fd属性表示一个打开的文件描述符