013_Linux驱动之_poll机制

走远了吗. 提交于 2019-12-26 12:36:48
  1. 功能:poll的机制与select相似,与select在本质上没有多大差别。管理多个描写叙述符也是进行轮询,依据描写叙述符的状态进行处理,可是poll没有最大文件描写叙述符数量的限制。

  2. 技术资料:poll多路复用 这篇文章写得很好

  3. 技术资料:poll机制分析

  4. 首先我们看应用程序中poll的调用原型
    //文件 数量 时间以毫秒为单位
    static unsigned int poll(struct file *file, struct socket *sock,poll_table *wait)

  5. 首先我们看看简单应用程序中如何使用的
    在这里插入图片描述

  6. 第一点中我们定义一个pollfd的数组变量,为什么是数组呢,因为调用poll函数时候可以同时调用很多个,所 以第三点传入数组地址时候就能够同时调用很多个
    第二点我们设置了文件和事件,具体其他的可以看看poll多路复用
    第三点就是我们应用程序中调用了,当我们运行这个时候,会调用到驱动程序中的.poll机制的程序

  7. 当我们上面运行应用程序时候,调用到ret = poll(fds, 1, 5000);这条时候驱动程序中就会运行forth_drv_poll函数
    在这里插入图片描述

  8. 从上面看,当调用到驱动程序之后会在poll_wait(file, &button_waitq, wait);停下来

  9. 解析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的等待队列中去
想要就行往下运行,则需要

  1. button_waitq的头队列被唤醒
  2. 时间wait超过5000ms
    在这里插入图片描述
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!