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

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

ID:39586379

大小:52.00 KB

页数:6页

时间:2019-07-06

高级字符设备驱动-Poll设备方法笔记_第1页
高级字符设备驱动-Poll设备方法笔记_第2页
高级字符设备驱动-Poll设备方法笔记_第3页
高级字符设备驱动-Poll设备方法笔记_第4页
高级字符设备驱动-Poll设备方法笔记_第5页
资源描述:

《高级字符设备驱动-Poll设备方法笔记》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、POLL方法什么是POLL方法,功能是什么?系统调用(用户空间)驱动(内核空间)OpenOpenCloseReleaseReadReadWriteWriteIoctlioctlLseekLlseekSelectpollSelect系统调用(功能)Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程Intselect(intmaxfd,fd_set*readfds,fd_set*writefds,fe_set*exceptfds,conststructtimeval*timeout)Maxfd文件描述符的范围,比待检测的最大文件描述符

2、大1Readfds被读监控的文件描述符集Writefds被写监控的文件描述符集Exceptfds被异常监控的文件描述符集Timeout定时器Timeout取不同的值,该调用有不同的表现1)Timeout为0,不管是否有文件满足要求,都立即返回,无文件满足要求返回0,有文件满足要求返回一个正值。2)Timeout为null,select将阻塞进程,直到某个文件满足要求。3)Timeout值为正整数,就是等待的最长时间,即select在timeout时间内阻塞进程。Select调用返回时,返回值有如下情况:1)正常情况下返回满足要求的文件描述符个数2)经过了timeou

3、t等待后仍无文件满足要求,返回值为03)如果select被某个信号中断,它将返回-1并设置errno为EINTR4)如果出错,返回-1并设置相应的errnoSelect系统调用(使用方法)1)将要监控的文件添加到文件描述符集2)调用select开始监控3)判断文件是否发生变化系统提供了4个宏对描述符集进行操作:#includeVoidFD_SET(intfd,fd_set*fdset)VoidFD_CLR(intfd,fd_set*fdset)VoidFD_ZERO(fd_set*fdset)VoidFD_ISSET(intfd,fd_s

4、et*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,假设fd1>fd2Switch(select(maxfdp,&fds,NULL,NULL

5、,&timeout))//读监控Case-1:exit(-1);break;//select错误,退出程序Case0:break;Default:If(FD_ISSET(fd1,&fds))//测试fd1是否可读POLL方法原型:unsignedint(*poll)(structfile*filp,poll_table*wait)负责完成:1)使用poll_wait将等待队列添加到poll_table中2)返回描述设备是否可读或者可写的掩码位掩码:POLLIN设备可读POLLRDNORM数据可读POLLOUT设备可写POLLWRNORM设备可写例子:Staticun

6、signedintmem_poll(structfile*filp,poll_table*wait){Structscull_pipe*dev=filp->private_data;Unsignedintmask=0;Poll_wait(filp,&dev->inq,wait);//把等待队列添加到poll-tableIf(有数据可读)Mask=PONNIN

7、POLLRDNORM;//设备可读Returnmask;//返回掩码}工作原理:POLL方法只是做一个登记,真正的阻塞发生在select.c中的do_select函数内核代码分析:do_select是selec

8、t系统调用所对应的内核函数,do_select完成select的功能。intdo_select(intn,fd_set_bits*fds,structtimespec*end_time){ktime_texpire,*to=NULL;structpoll_wqueuestable;poll_table*wait;intretval,i,timed_out=0;unsignedlongslack=0;rcu_read_lock();retval=max_select_fd(n,fds);rcu_read_unlock();if(retval<0)returnret

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。