Linux驱动学习笔记:IO多路复用_第1页
Linux驱动学习笔记:IO多路复用_第2页
Linux驱动学习笔记:IO多路复用_第3页
Linux驱动学习笔记:IO多路复用_第4页
Linux驱动学习笔记:IO多路复用_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页Linux驱动学习笔记:IO多路复用

什么是IO多路复用

简单来说,就是解决能够同时操作多个设备的方法,及时处理多个设备的数据。

具体的,是指单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力。

IO多路复用的三种方法

(Linux)的IO多路复用有三种方法:select、poll、epoll,且这三种方法都是系统调用。

这里介绍(嵌入式)中常用的两种select和poll。

select

相关接口

/*AccordingtoPOSIX.1-2023,POSIX.1-2023*/#include/*Accordingtoearlierstandards*/#include#include#includeintselect(intnfds,fd_set*re(ad)fds,fd_set*wri(te)fds,fd_set*exceptfds,struct(ti)meval*timeout);intpselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,conststructtimespec*timeout,constsigset_t*sigmask);intFD_ISSET(intfd,fd_set*set);voidFD_SET(intfd,fd_set*set);voidFD_CLR(intfd,fd_set*set);voidFD_ZERO(fd_set*set);select把要监视的文件描述符分成三类:readfds、writefds、exceptfds`。

readfds是需要进行读操作的文件描述符,writefds是需要进行写操作的文件描述符,exceptfds是需要进行异常处理的文件描述符。对于不需要监听的,填NULL即可。

第一次对n个文件进行select()的时候,若任何一个文件满足要求,select()就直接返回;第2次再进行select()的时候,没有文件满足读写要求,select()的进程阻塞且睡眠。示意图如下:

fd_set是文件描述符组,需要通过FD_XX系列的函数来操作。例如:

FD_ZERO:清空文件描述符组

fd_setwritefds;FD_ZERO("class="hljslessvditor-linenumber">FD_SET(fd,//将fd加进组中FD_CLR(fd,//将fd从组中删除FD_ISSET:(检测)一个文件描述符是否在组中,我们用这个来检测一次select调用之后有哪些文件描述符可以进行IO操作

if(FD_ISSET(fd,"class="hljsobjectivecvditor-linenumber">#includeintpoll(structpollfdfds[],nfds_tnfds,inttimeout);poll()函数也是一个系统调用,可实现类似select()的效果。与select()不同的是,select将要监听的文件描述符分为读、写、异常三种,而poll则使用一个文件描述符集structpollfdfds[]来管理。

structpollfd用来描述一个需要监听的文件描述符,传参时传入structpollfd类型数组fds。

参数说明

参数说明fds一个structpollfd结构类型的数组,用于存放需要检测其状态的文件描述符集;nfds用于标记数组fds中的结构体元素的总数量timeout阻塞的时间,单位:毫秒;如果timeout==0,那么poll()函数立即返回而不阻塞,如果设置为负数,那么poll()函数会一直阻塞下去,直到所检测的文件描述符上的感兴趣的事件发生是才返回。返回值:

0:数组fds中准备好读、写或出错状态的那些文件描述符的总数量

==0:代表poll超时-1:代表poll函数调用失败,同时会自动设置全局变量errnostructpollfd结构体

structpollfd{intfd;/*文件描述符*/shortevents;/*等待的需要测试事件*/shortrevents;/*实际发生了的事件,也就是返回结果*/}events和revents事件值:

常量说明POLLIN普通或优先级带数据可读POLLRDNORM普通数据可读POLLRDBAND优先级带数据可读POLLPRI高优先级数据可读POLLOUT普通数据可写POLLWRNORM普通数据可写POLLWRBAND优先级带数据可写POLLERR发生错误POLLHUP发生挂起POLLNVAL描述字不是一个打开的文件poll系统调用过程poll系统调用在内核中的入口函数是sys_poll(),sys_poll()的系统调用关系如下:

关键点是在vfs_poll()函数:

//include/linux/poll.hstaticinline__poll_tvfs_poll(structfile*file,structpoll_table_struct*pt){if(unlikely(!file->f_op->poll))returnDEFAULT_POLLMASK;returnfile->f_op->poll(file,pt);//调用到驱动中的poll函数}file->f_op->poll(file,pt)会调用到驱动中的poll函数.

驱动中poll机制实现

驱动中只需要实现structfile_operations结构体里的poll函数,代码如下:

staticunsignedintmy_poll(structfile*fp,structpoll_table_struct*w(ai)t){unsignedintmask=0;poll_wait(fp,//将驱动中的等待队列btn_waitq添加进等待队列表table中if(ev_press)mask|=POLLIN|POLLRDNORM;returnmask;}staticstructfile_operationsmy_fops={.owner=THIS_MODULE,.poll=my_poll,};应用程序调用poll()时,内核中会调用每个设备驱动中的poll函数,这些底层函数都会调用poll_wait()将本设备驱动中的等待队列添加到一个等待队列表中(table)

如果监控设备

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论