Poll设备操作(国嵌笔记)

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中根据返回的掩码来决定是否发生阻塞(通过调度)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值