Linux设备驱动一 (2)poll
来源:互联网 发布:java自学步骤 编辑:程序博客网 时间:2024/06/05 04:33
poll函数原型:
unsigned int(*poll)(struct file *filp, struct poll_table *wait);
//第一个参数为file结构体指针,第二个参数为轮询表指针。
这个函数应该进行以下两项工作:
1)对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应等待队列添加到poll_table中;
2)返回表示是否能对设备进行无阻塞可读或可写访问的掩码;
位掩码:POLLRDNORM, POLLIN,POLLOUT,POLLWRNORM
设备可读,通常返回:(POLLIN | POLLRDNORM)
设备可写,通常返回:(POLLOUT | POLLWRNORM)
常量 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 发生挂起
POLLNVAL 描述字不是一个打开的文件
网上抄袭的poll机制
当应用程序调用poll函数的时候,会调用到系统调用sys_poll函数,该函数最终调用do_poll函数,do_poll函数中有一个死循 环,在里面又会利用do_pollfd函数去调用驱动中的poll函数(fds中每个成员的字符驱动程序都会被扫描到),驱动程序中的Poll函数的工作 有两个,一个就是调用poll_wait 函数,把进程挂到等待队列中去(这个是必须的,你要睡眠,必须要在一个等待队列上面,否则到哪里去唤醒你呢??),另一个是确定相关的fd是否有内容可 读,如果可读,就返回1,否则返回0,如果返回1 ,do_poll函数中的count++, 然后 do_poll函数然后判断三个条件(if (count ||!timeout || signal_pending(current)))如果成立就直接跳出,如果不成立,就睡眠timeout个jiffes这么长的时间(调用schedule_timeout实现睡眠),如果在这段时间内没有其他进程去唤醒它,那么第二次执行判断的时候就会跳出死循环。如果在这段时间内有其他进程唤醒它,那么也可以跳出死循环返回(例如我们可以利用中断处理函数去唤醒它,这样的话一有数据可读,就可以让它立即返回)。
个人理解的 Poll机制:
1):当应用程序调用 poll();2):内核通过一系列的函数调用最终会调用驱动中的 xxx_dev_poll()函数;
3):在 xxx_dev_poll()中调用 poll_wait()将进程添加到指定的等待队列(注意!仅仅是添加,没有休眠);
4):然后函数返回,内核会根据返回值判断是否让进程进入休眠状态
1: 返回 0时进程进入休眠, 返回值此时不会传输到应用程序,
2: 返回非0时进程不休眠 , 返回值此时 会传输到应用程序,应用程序继续执行....
5):若进程进入休眠状态,在等待 timeout 时间后,自动唤醒进程, 再次调用 驱动中的 xxx_dev_poll()函数;
6):调用 poll_wait()将进程添加到指定的等待队列,函数返回,
7):此时无论返回值为何,进程都不会休眠,而是将返回值传输到应用程序,应用程序继续执行....
驱动
应用程序
结果
- Linux设备驱动一 (2)poll
- LINUX字符设备驱动2------POLL机制
- Linux设备驱动模板:poll
- Linux设备驱动---poll函数
- linux设备驱动:poll和sellct
- Linux 设备驱动--- Poll 方法 --- Select
- linux设备驱动:poll和sellct
- Linux 设备驱动poll轮询编程
- linux设备驱动之POLL机制
- linux字符设备驱动-poll机制笔记
- Linux字符设备驱动之poll机制
- linux设备驱动开发-高级字符设备操作poll
- Linux 设备驱动 一
- 07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键驱动程序
- linux设备驱动--非阻塞IO与select,poll调用 (续2)
- 3、Linux设备驱动---轮询操作poll()函数
- linux设备驱动--非阻塞IO与select,poll调用
- Linux设备驱动编程之poll()函数原理
- java知识总结(五)抽象和接口
- jquery刷新页面的实现代码(局部及全页面刷新)
- Ubuntu eclipse 快捷方式
- AsyncHttpClient实现https,并且实现SSL双向验证
- 关系型和非关系型数据库的区别?
- Linux设备驱动一 (2)poll
- 【学习笔记】缓冲区溢出
- 决策树回归R语言实现
- Java集合---LinkedList源码解析
- Http的Cache机制
- jdbc连接数据库Sql Server2012
- [ZJOI2002] 青蛙的约会
- Objective-C - A类作为B类的属性
- 《第一行代码(第二版)》的学习(一)