Poll设备操作(国嵌笔记)

来源:互联网 发布:单片机圆孔插座 编辑:程序博客网 时间:2024/06/06 01:47
Poll设备操作
用户空间中的select对应内核中的Poll

1.select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程。
int select(int maxfd,fd_set *readfds,fd_set *writefds,fe_set *exceptfds,const struct timeval *timeout)
maxfd:文件描述符的范围,比待检测的最大文件描述符大1即可
readfds:被读监控的文件描述符
writefds:被写监控的文件描述符
exceptfds:被异常监控的文件描述符
timeout:定时器,0:不管是否满足要求,都会立即返回。NULL:select将阻塞,直到某个文件满足要求。正整数:就是等待的最长时间,即select在timeout时间内阻塞进程
2.返回值:正常情况下,返回满足要求的文件描述符个数,经过timeout等待后仍无文件满足要求,返回0;select被某个信号中断,返回-1并设errno为EINTR;如果出错,返回-1并设置相应的errno
3.使用步骤:
1.将要监控的文件添加到文件描述符集
2.调用select开始监控
3.判断文件是否发生变化


系统提供了4个宏来对描述符集来进行描述
#include<sys/select.h>
FD_SET,FD_CLR,FD_SERO,FD_ISSET
4.poll方法
原型:unsigned int(*poll)(struct file *filp,poll_table *wait)
poll设备方法负责完成
1.使用poll_wait将等待队列添加到poll_table
2.返回描述设备是否可读或可写的掩码(POLLIN,POLLRDNORM等)
5.范例
static unsigned int mem_poll(struct file *filp,poll_table *wait)
{
struct scull_pipe *dev =filp->private_data;
unsigned int mask=0;
//把等待队列添加到poll_table中
poll_wait(filp,&dev->inq,wait);
//返回掩码
if(有数据可读)
mask=POLLIN|POLLRDNORM;//设备可读
return mask;
}
6.工作原理
Poll方法只是做一个登记,真正的阻塞发生在select.c中的do_select函数。
do_select中根据返回的掩码来决定是否发生阻塞(通过调度)

0 0