- 论坛徽章:
- 0
|
应用程序的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;
} |
|