select系统调用与驱动程序当中的poll相对应.它可能会阻塞进程。select系统调用由驱动的poll方法实现。
1.select需要函的头文件:
#include <sys/select.h>
2.select函数源型:
int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout);
maxfd - 文件描述符的范围,比待检测的最大文件描述符大1
readfds - 被读监控的文件描述符集
writefds - 被写监控的文件描述符集
exceptfds - 被异常监控的文件描述符集
timeout - 监控的超时时间。到时间后不再监控。函数返回
返回值 - a.正常返回时,返回值为满足条件的文件描述符的个数
b.经过timeout等待后仍然无文件满足要求,返回0
c.如果select被某个信号中断,返回-1,并设置errno为EINTR
d.如果出错,返回-1,并设置errno为相应的值
3.select相关的宏定义:
void FD_SET(int fd, fd_set *fdset); // 将文件描述符fd添加到文件描述符集合fdset中
void FD_CLR(int fd, fd_set *fdset); // 从文件描述符集合fdset中清除文件描述符fd
void FD_ZERO(fd_set *fdset); // 清空文件描述符集合fdset
void FD_ISSET(int fd, fd_set *fdset); // 调用select后,测试是否fd满足监控条件
4.poll方法原型:
unsigned int (*poll)(struct file *filp, poll_table *wait);
5.poll设备方法的作用:
a.使用poll_wait函数将等待队列添加到poll_table中
b.返回描述设备是否可读或可写的掩码
c.掩码:
POLLIN - 设备可读
POLLRDNORM - 数据可读
POLLOUT - 设备可写
POLLWRNORM - 数据可写
设备可读通常返回( POLLIN | POLLRDNORM )
设备可写通常返回( POLLOUT | POLLWRNORM )
驱动中的poll方法并不会导致进程阻塞,它只是负责登记等待队列。阻塞发生在select()函数中的do_select()函数。