- 论坛徽章:
- 0
|
linux设备驱动程序第三版有如下代码:
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;
}
我有几点略感迷茫啊:
1、这个poll table *wait哪里来的,是不是要在函数外面malloc一下
2、既然是轮询,那为啥要有两条poll_wait呢,直接判断rp和wp的位置不就可以知道是否能读还是能写了吗。
3、书上说poll_wait是把进程加入等待队列,那么就是说不管如何,执行了poll_wait进程就被阻塞了,那就和后面的判断没关系了,就算有数据可以读或者有空间可以写那也阻塞了,这明显不合理啊
4、既然阻塞睡眠了,那谁叫醒他们呢?书上意思貌似是自动叫醒,很不理解
谢谢谢谢!
|
|