为什么我们需要在民意调查中调用poll_wait?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我们需要在民意调查中调用poll_wait?相关的知识,希望对你有一定的参考价值。

在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不会等待并立即返回。那为什么我们需要打电话呢?为什么我们不能只返回面具?

答案

poll_wait将您的设备(由“struct file”表示)添加到可以唤醒进程的列表中。

这个想法是该过程可以使用poll(或select或epoll等)将一堆文件描述符添加到它希望等待的列表中。调用每个驱动程序的轮询条目。每个人都将自己(通过poll_wait)添加到服务员列表中。

然后核心内核在一个地方阻止进程。这样,任何一个设备都可以唤醒进程。如果返回非零掩码位,则表示现在应用那些“就绪”属性(可读/可写/等)。

所以,在伪代码中,它大致是这样的:

foreach fd:
    find device corresponding to fd
    call device poll function to setup wait queues (with poll_wait) and to collect its "ready-now" mask

while time remaining in timeout and no devices are ready:
    sleep

return from system call (either due to timeout or to ready devices)
另一答案

如果你返回pollfile_operation 0会睡觉

这让我很困惑。

当您返回非零值时,表示某个事件被触发,并且它被唤醒。

一旦你看到这一点,很明显必须将进程绑定到等待队列,那就是poll_wait

还要记住,struct file表示“进程和打开文件之间的连接”,而不仅仅是文件系统文件,因此它包含pid,用于标识进程。

玩一个最小的可运行示例也可能有助于清理:https://stackoverflow.com/a/44645336/895245

另一答案

poll_wait在任何正在等待的fd上发生预期事件时触发,或者它超时。

检查掩码以了解触发poll_wait的事件。如果您不希望poll_wait在此类事件上触发,则可以在注册文件描述符时对其进行配置以轮询fd。

以上是关于为什么我们需要在民意调查中调用poll_wait?的主要内容,如果未能解决你的问题,请参考以下文章

p:民意调查已停止,但仍然会触发网络电话

无法阻止Primefaces民意调查

Primefaces 一项民意调查“暂停”另一项民意调查

3视图和模板

为啥 Mio 的民意调查会针对用户生成的事件触发两次?

Django民意调查app没有选择和点击选票投票