在LDD3中,我看到了这样的代码
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;
}
但是它说poll_wait不会等待并立即返回。那为什么我们需要打电话呢?为什么我们不能返回掩码?
答案 0 :(得分:12)
poll_wait将您的设备(由“struct file”表示)添加到可以唤醒进程的列表中。
这个想法是,进程可以使用poll(或select或epoll等)将一堆文件描述符添加到它希望等待的列表中。调用每个驱动程序的轮询条目。每个人都将自己(通过poll_wait)添加到服务员列表中。
然后核心内核在一个地方阻止进程。这样,任何一个设备都可以唤醒进程。如果返回非零掩码位,则表示那些“就绪”属性(可读/可写/等)现在应用 。
所以,在伪代码中,它大致是这样的:
if ($host ~* ^www\.(.*)$) {
rewrite / $scheme://$1 permanent;
}
答案 1 :(得分:2)
如果您返回poll
,则file_operation
0
会休眠
这让我很困惑。
当你返回非零时,表示某个事件被触发,它就会被唤醒。
一旦你看到了这一点,很明显必须将进程绑定到等待队列,那就是poll_wait
。
还要记住struct file
表示“进程和打开文件之间的连接”,而不仅仅是文件系统文件,因此它包含pid,用于标识进程。
使用最小的可运行示例也可能有助于解决问题:https://stackoverflow.com/a/44645336/895245
答案 2 :(得分:-1)
poll_wait在任何正在等待的fd上发生预期事件时触发,或者它超时。
检查掩码以了解触发poll_wait的事件。如果您不希望poll_wait在此类事件上触发,则可以在注册文件描述符时对其进行配置以轮询fd。