Linux驱动基石之POLL机制( 二 )


在drv_poll函数中要做2件事:

  1. 把当前线程挂入队列wq:poll_wait
    APP调用一次poll , 可能导致drv_poll被调用2次 , 但是我们并不需要把当前线程挂入队列2次 。可以使用内核的函数poll_wait把线程挂入队列 , 如果线程已经在队列里了 , 它就不会再次挂入 。
  2. 返回设备状态:
    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机制】


推荐阅读