资源描述:
《高级字符设备驱动-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