1.轮询的概念和作用
使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞的访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被执行。
2.应用程序中的轮询编程---select()函数
select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程
int select(int maxfds, fd_set *readfds, fd_set *writefds, fd_set
*exceptfds, struct timeval *timeout)
maxfds:文件描述符的范围,是待检测的最大文件描述符加1
readfds:被读监控的文件描述符集
writefds:被写监控的文件描述符集
exceptfds:被异常监控的文件描述符集
timeout:它可以使select()在等待timeout时间后若没有文件描述符准备好
则返回
struct timeval *timeout {
int tv_set;
int tv_uset;
}
timeout的值有如下三种情况:
0:不管是否有文件满足要求,都立即返回,无文件满足要求返回
0,有文件满足要求时返回一个正值(结构体内成员为0)
NULL:select将阻塞进程,直到某个文件满足要求(指针为空)
正整数:就是等待的最长时间,即select在timeout时间内阻塞进程
返回值:1)正常情况下返回满足要求的文件描述符的个数
2)经过了timeout时间等待后仍无文件满足要求,返回值为0
3)如果select被某个信号中断,返回-1并设置errno为EINTR
4)如果出错,返回-1并设置errno为EINTR
下列操作用来设置、清除、判断文件描述符集合:
FD_ZERO(fd_set *set) //清除一个文件描述符集:
FD_SET(int fd,fd_set *set) //将一个文件描述符加入文件描述符集中
FD_CLR(int fd,fd_set *set) //将一个文件描述符从文件描述符集中清除
FD_ISSET(int fd,fd_set *set) //判断文件描述符是否被置位
3.设备驱动中的轮询编程---poll()函数
unsigned int (*poll)(struct file *filp, struct poll_table *wait)
poll设备方法完成两件事:
1)对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应
的等待队列头添加到poll_table
2)返回表示是否能对设备进行无阻塞读、写访问的掩码
poll_wait()函数:用于向poll_table注册等待队列
void poll_wait(struct file *filp, wait_queue_head_t *queue,
poll_table *wait)
poll_wait()函数所做的工作是把当前进程添加到wait参数指定的等待队列
(poll_table)中