在drv_poll函数中要做2件事:
- 把当前线程挂入队列wq:poll_wait
APP调用一次poll , 可能导致drv_poll被调用2次 , 但是我们并不需要把当前线程挂入队列2次 。可以使用内核的函数poll_wait把线程挂入队列 , 如果线程已经在队列里了 , 它就不会再次挂入 。 - 返回设备状态:
APP调用poll函数时 , 有可能是查询“有没有数据可以读”:POLLIN , 也有可能是查询“你有没有空间给我写数据”:POLLOUT 。所以drv_poll要返回自己的当前状态:(POLLIN | POLLRDNORM) 或 (POLLOUT | POLLWRNORM) 。POLLRDNORM等同于POLLIN , 为了兼容某些APP把它们一起返回 。POLLWRNORM等同于POLLOUT , 为了兼容某些APP把它们一起返回 。
APP调用poll后 , 很有可能会休眠 。对应的 , 在按键驱动的中断服务程序中 , 也要有唤醒操作 。
驱动程序中poll的代码如下:
static unsigned int gpio_key_drv_poll(struct file *fp, poll_table * wait){ printk("%s %s line %dn", __FILE__, __FUNCTION__, __LINE__); poll_wait(fp, &gpio_key_wait, wait); return is_key_buf_empty() ? 0 : POLLIN | POLLRDNORM;}
4 应用编程注意:APP可以调用poll或select函数 , 这2个函数的作用是一样的 。
poll/select函数可以监测多个文件 , 可以监测多种事件:
事件类型 说明
POLLIN 有数据可读
POLLRDNORM 等同于POLLIN
POLLRDBAND Priority band data can be read , 有优先级较较高的“band data”可读
linux系统中很少使用这个事件
POLLPRI 高优先级数据可读
POLLOUT 可以写数据
POLLWRNORM 等同于POLLOUT
POLLWRBAND Priority data may be written
POLLERR 发生了错误
POLLHUP 挂起
POLLNVAL 无效的请求 , 一般是fd未open
【Linux驱动基石之POLL机制】
推荐阅读
- Linux ALSA 图解
- Linux 下的交互式进程浏览器 htop 3.0.0 发布
- 带你玩转 Linux Shellcode
- 在Linux中查找已连接网络的WiFi密码
- 呕心沥血整理的linux服务器一条龙服务
- Linux select/poll机制原理分析
- Linux安全技巧汇总,防止扫描,禁止空密码,强制用V2等
- 使用growpart工具完成Linux系统盘分区扩容
- Linux下如何知道是否有人在使坏?
- 树莓派无屏上手指南