Linux学习笔记(4)poll机制的应用程序

这部分的学习目标:了解poll机制的实现原理,掌握poll实现按键读取的方式。
目前对poll机制的理解:poll机制的实质就是系统帮你在一定的等待时间之后或者有其他信号量时退出函数调用。
对于poll机制的深入了解可能还要花些时间,但是对于入门,我们先掌握poll机制的使用方法,达到能够构建对应的应用程序的目标。
1.poll机制实现按的代码分析

首先看poll机制按键的驱动程序,驱动程序中唯一的区别是添加了 gbfour_drv_poll() 函数:
static unsigned gbfour_drv_poll(struct file *file, struct poll_table_struct *wait)
{
unsigned int mask = 0;
poll_wait(file, &button_waitq, wait);
if ( ev_press )
{
mask |= POLLIN | POLLRDNORM;
}
return mask;
}
该函数的作用是使进程进入阻塞状态,直到检测到按键中断或者其他信号量,或超时。
按键值读取函数和按键中断处理函数 buttons_irq() 都与没有使用poll机制的按键驱动程序一样。
再看应用层程序。使用poll机制的应用层程序在读取按键钱调用poll函数,是进程进入阻塞状态,当退出阻塞后调用read函数读取按键值。
2.为什么要使用一个 pollfd 结构体类型的数组
因为poll函数的第一个参数就是pollfd结构体类型,来看看这个结构体定义:
    #include <sys/poll.h> 
    int poll(struct pollfd *ufds, unsigned int nfds, int timeout); 
    struct pollfd 
    { 
        int fd; /* 想查询的文件描述符. */ 
        short int events; /* fd 上,我们感兴趣的事件*/ 
        short int revents; /* Types of events that actually occurred. */ 
    };
    ufds 指向 struct pollfd 数组 
    nfds 指定 pollfd 数组元素的个数,也就是要监测几个 pollfd
使用这个结构体数组是由poll的处理机制决定的。因为poll内部实现了查询多个设备文件的操作。
3.poll机制的实际效果
与直接使用中断方式实现按键的方式相比,驱动程序中断read函数的实现是一样的。都是休眠等待按键动作,有按键动作后被 buttons_irq() 函数唤醒,然后拷贝按键值到用户空间。本实验中使用poll机制后先使用poll函数让进程进入休眠状态,当poll检测到相应的事件发生后进程退出休眠,如果检测到相应的事件(我们关注的事件是按键中断,而poll也可能因为其他事件而返回,例如超时或其他信号量等待等)。
    static unsigned gbfour_drv_poll(struct file *file, struct poll_table_struct *wait)
    {
        unsigned int mask = 0;
        poll_wait(file, &button_waitq, wait);
        if ( ev_press )
        {
            mask |= POLLIN | POLLRDNORM;
        }
        return mask;
    }
从这个函数可以看到poll在poll_wait等待结束后根据 ev_press 的值来决定返回的值,而 ev_press 由 buttons_irq() 置位,即表示按键按下。也就是说poll_wait()函数会因为多种原因结束等待,还需要根据 ev_press 来判断是否为按键中断(这样理解也不完全正确,其实在poll_wait()函数中的实际上是知道是那种原因结束等待的)。
4. 还没有理解的问题:为什么要使用poll机制?
目前的理解是,使用poll机制可以使得读取按键的过程在超时后结束。相信还需要更进一步的理解。
来自为知笔记(Wiz)
分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/linux%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%884%ef%bc%89poll%e6%9c%ba%e5%88%b6%e7%9a%84%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名