• 013_Linux驱动之_poll机制


    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

  • 相关阅读:
    Code First 数据迁移 转
    WebAPI Post接收数据
    hbase1.2.4 API改动
    spark中RDD持久化浅析
    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Attr_id' in 'where clause'
    宝塔忘记面板地址怎么办? 可以找到没问题的
    卸载Apache 删除已经停止的服务
    Composer 卸载
    TP5.1模型 增删改查
    打印数据库int类型的时间戳
  • 原文地址:https://www.cnblogs.com/luxiaoguogege/p/9690239.html
Copyright © 2020-2023  润新知