首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

驱动中poll_wait()函数的疑问

驱动中poll_wait()函数的疑问

应用程序的select()系统调用,调用驱动中的poll()方法。
不理解的是在下面的poll()方法实现中,首先调用poll_wait将等待队列添加到wait结构中,接下来是个判断语句  
if (dev->rp != dev->wp)
                mask |= POLLIN | POLLRDNORM;  /* readable */
只考虑可读情况。如果这个if语句的条件不满足,那么就不会返回可读,也就是返回0。那么在这里怎么实现阻塞的呢?也就是说如果在应用的select()系统中,指定一个等待时间,在这个等待时间里如果没有描述符可读,就一直阻塞。那个这个等待时间是怎么和驱动中的poll()方法联系起来的呢?如果要修改这个poll()方法怎么修改呢?还有在poll()方法中,怎么指定描述符集中的哪一个是可读的呢?简单的返回POLLIN | POLLRDNORM,是无法指定是哪一个描述符可读的呀?
               
static unsigned int scull_p_poll(struct file *filp, poll_table *wait)
{
        struct scull_pipe *dev = filp->private_data;
        unsigned int mask = 0;

        /*
        * The buffer is circular; it is considered full
        * if "wp" is right behind "rp" and empty if the
        * two are equal.
        */
        down(&dev->sem);
        poll_wait(filp, &dev->inq,  wait);
       // poll_wait(filp, &dev->outq, wait);
        if (dev->rp != dev->wp)
                mask |= POLLIN | POLLRDNORM;  /* readable */
        //if (spacefree(dev))
        //        mask |= POLLOUT | POLLWRNORM;  /* writable */
        up(&dev->sem);
        return mask;
}
返回列表