- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
高级字符设备驱动-Poll设备方法笔记.
POLL方法
什么是POLL方法,功能是什么?
系统调用(用户空间) 驱动(内核空间) Open Open Close Release Read Read Write Write Ioctl ioctl Lseek Llseek Select poll
Select系统调用(功能)
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 定时器
Timeout 取不同的值,该调用有不同的表现
1)Timeout为0,不管是否有文件满足要求,都立即返回,无文件满足要求返回0,有文件满足要求返回一个正值。
2)Timeout 为null,select将阻塞进程,直到某个文件满足要求。
3)Timeout 值为正整数,就是等待的最长时间,即select在timeout 时间内阻塞进程。
Select调用返回时,返回值有如下情况:
1)正常情况下返回满足要求的文件描述符个数
2)经过了timeout等待后仍无文件满足要求,返回值为0
3)如果select被某个信号中断,它将返回-1并设置errno为EINTR
4)如果出错,返回-1并设置相应的errno
Select系统调用(使用方法)
1)将要监控的文件添加到文件描述符集
2)调用select开始监控
3)判断文件是否发生变化
系统提供了4个宏对描述符集进行操作:
#includesys/select.h
Void FD_SET(int fd, fd_set *fdset)
Void FD_CLR(int fd, fd_set *fdset)
Void FD_ZERO(fd_set *fdset)
Void FD_ISSET(int fd, fd_set *fdset)
宏FD_SET将文件描述符fd添加到文件描述符fdset中
宏FD_CLR从文件描述符集fdset中清除文件描述符fd
宏FD_ZERO清空文件描述符集fdset
在调用select后使用FD_ISSET来检测文件描述符集fdset中的文件fd发生了变化
使用例子(对两个文件进行读监控):
FD_ZERO(fds);//清空集合
FD_SET(fd1,fds);//设置描述符
FD_SET(fd2,fds);//设置描述符
Maxfdp = fd1+1;//描述符最大值加1,假设fd1fd2
Switch(select(maxfdp,fds,NULL,NULL,timeout))//读监控
Case -1: exit(-1);break;//select错误,退出程序
Case 0:break;
Default:
If(FD_ISSET(fd1,fds)) //测试fd1是否可读
POLL方法
原型:unsigned int (*poll)(struct file *filp, poll_table *wait)
负责完成:
1)使用poll_wait将等待队列添加到poll_table 中
2)返回描述设备是否可读或者可写的掩码
位掩码:
POLLIN
设备可读
POLLRDNORM
数据可读
POLLOUT
设备可写
POLLWRNORM
设备可写
例子:
Static unsigned int mem_poll(struct file *filp, poll_table *wait)
{
Struct scull_pipe *dev = filp-private_data;
Unsigned int mask = 0;
Poll_wait(filp,dev-inq,wait); //把等待队列添加到poll-table
If(有数据可读)
Mask = PONNIN | POLLRDNORM; //设备可读
Return mask; //返回掩码
}
工作原理:
POLL方法只是做一个登记,真正的阻塞发生在select.c中的do_select函数
内核代码分析:
do_select是select系统调用所对应的内核函数,do_select完成select的功能。
int do_select(int n, fd_s
您可能关注的文档
- 高压变频器的选型..doc
- 高压电缆试验作业指导书..doc
- 高层住宅剪力墙的合理布置..doc
- 高层体育馆监理月报..doc
- 高层建筑水电安装工程监理程序..doc
- 高层民用建筑防火规范..doc
- 高度关注民生问题,预防社会危机,加快推进社会保障工作..doc
- 高性能计算集群(HPCCLUSTER)..doc
- 高性能MP2300运动控制器..doc
- 高手总结java常用API..doc
- 携程产品营销经理岗面试题库参考答案和答题要点.docx
- 携程产品经理岗面试题库参考答案和答题要点.docx
- 携程供应链管理专员岗面试题库参考答案和答题要点.docx
- 携程交易数据分析师岗面试题库参考答案和答题要点.docx
- 携程公共关系专员岗面试题库参考答案和答题要点.docx
- 携程内部培训专员岗面试题库参考答案和答题要点.docx
- 福建省福州市2023-2024学年高二上学期期末测试英语试卷(含答案).pdf
- 携程人力资源专员岗面试题库参考答案和答题要点.docx
- 福建省三明市2023-2024学年高二上学期期末测试英语试卷(含答案).docx
- 福建省三明市2023-2024学年高二上学期期末测试英语试卷(含答案).pdf
文档评论(0)