高级字符设备驱动-Poll设备方法笔记..doc

高级字符设备驱动-Poll设备方法笔记..doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

dashewan + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档