入口参数,最大文件描述符+1,文件描述符集,时间结构体,有监视最大数量限值1024。
fd_set readfds;
struct timeval timeout;
while (1) {
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
timeout.tv_sec = 0;
timeout.tv_usec = 500000;
ret = select(fd + 1, &readfds, NULL, NULL, &timeout);
switch (ret) {
case 0:
break;
case -1:
break;
.....
default: break;
}
timeout为空,阻塞运行;timeout为0,非阻塞运行;具体值则等待;
select函数的非阻塞应用select
poll(用户):fds为pollfd数组指针,无数量限值。nfds为监视文件数目。
int poll(struct pollfd *fds, nfds_t nfds, int timeout)
struct pollfd {
int fd;
short events;
short revents;
};
fd 是要监视的文件描述符,如果 fd 无效的话那么 events 监视事件也就无效,并且 revents
返回 0。
events 是要监视的事件,可监视的事件类型如下所示:
POLLIN 有数据可以读取。
POLLPRI 有紧急的数据需要读取。
POLLOUT 可以写数据。
POLLERR 指定的文件描述符发生错误。
POLLHUP 指定的文件描述符挂起。
POLLNVAL 无效的请求。
POLLRDNORM 等同于 POLLIN
revents 是返回参数,也就是返回的事件,由 Linux 内核设置具体的返回事件。
poll(驱动):
是file_operations的成员,为文件基本操作函数。
unsigned int imx6uirq_poll(struct file *filp, struct poll_table_struct *wait)
{
unsigned int mask = 0;
struct imx6uirq_dev *dev = (struct imx6uirq_dev *)filp->private_data;
poll_wait(filp, &dev->r_wait, wait);
if(XXX)) {
mask = POLLIN | POLLRDNORM;
}
return mask;
}
Select、Poll、Epoll详解 - 简书



