-
功能:poll的机制与select相似,与select在本质上没有多大差别。管理多个描写叙述符也是进行轮询,依据描写叙述符的状态进行处理,可是poll没有最大文件描写叙述符数量的限制。
-
技术资料:poll多路复用 这篇文章写得很好
-
技术资料:poll机制分析
-
首先我们看应用程序中poll的调用原型
//文件 数量 时间以毫秒为单位
static unsigned int poll(struct file *file, struct socket *sock,poll_table *wait) -
首先我们看看简单应用程序中如何使用的
-
第一点中我们定义一个pollfd的数组变量,为什么是数组呢,因为调用poll函数时候可以同时调用很多个,所 以第三点传入数组地址时候就能够同时调用很多个
第二点我们设置了文件和事件,具体其他的可以看看poll多路复用
第三点就是我们应用程序中调用了,当我们运行这个时候,会调用到驱动程序中的.poll机制的程序 -
当我们上面运行应用程序时候,调用到ret = poll(fds, 1, 5000);这条时候驱动程序中就会运行forth_drv_poll函数
-
从上面看,当调用到驱动程序之后会在poll_wait(file, &button_waitq, wait);停下来
-
解析poll_wait,函数原型
// 文件 等待队列头 poll_table就是传入的时间
static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
10.解析上面图片中poll_wait(file, &button_waitq, wait);
从上面三张图片程序运行时从应用程序到驱动程序的参数传递。
也就是说应用程序传递给可poll_wait的文件file和时间wait=5000MS
button_waitq是等待队列头012_Linux驱动之_wait_event_interruptible
11. 当运行到poll_wait时候,进程就会挂到button_waitq的等待队列中去
想要就行往下运行,则需要
- button_waitq的头队列被唤醒
- 时间wait超过5000ms