stuman 发表于 2014-07-05 18:43

LDD中的pool

本帖最后由 stuman 于 2014-07-05 19:51 编辑

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;
}以上是LDD中poll的代码。按照书上的说法,当没有文件描述符可执行I/O操作时,调用poll的进程就会睡眠。但是这里使用poll_wait添加了两个等待队列,一个用于读一个用于写。那么内核是如何判断无法写时在dev->outq上睡眠,而无法读时在dev->inq上睡眠呢?

还有函数poll_wait中添加的等待队列的用处到底是什么呢?如果使用poll查询是否可以执行非阻塞操作,那么根本不需要poll_wait函数呀。
页: [1]
查看完整版本: LDD中的pool