新手请教关于poll方法的问题

发布于 2022-09-18 19:08:36 字数 3206 浏览 6 评论 0

unsigned int scull_p_poll(struct file *filp, poll_table *wait)
{
Scull_Pipe *dev = filp->private_data;
unsigned int mask = 0;
/*
* The buffer is circular; it is considered full
* if "wp" is right behind "rp". "left" is 0 if the
* buffer is empty, and it is "1" if it is completely full.
*/

int left = (dev->rp + dev->buffersize - dev->wp) % dev->buffersize;
poll_wait(filp, &dev->inq, wait);
poll_wait(filp, &dev->outq, wait);
if (dev->rp != dev->wp) mask |= POLLIN | POLLRDNORM; /* readable */
if (left != 1) mask |= POLLOUT | POLLWRNORM; /* writable */
return mask;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

回心转意 2022-09-25 19:08:36

原帖由 APLEE 于 2009-3-11 22:20 发表
unsigned int scull_p_poll(struct file *filp, poll_table *wait)
{
Scull_Pipe *dev = filp->private_data;
unsigned int mask = 0;
/*
* The buffer is circular; it is considered full
* if "wp" is ...

你这样肯定不对了,要么再一个函数中进行out和in的poll检查(这个我不sure是否可以);
要么fork一个进程,两个进程各自自己的poll,这样岂不是就ok了

双马尾 2022-09-25 19:08:36

poll_wait 仅仅是将当前进程加入等待队列,并不会进入睡眠。
在系统调用select/poll中,会把当前进程加入所有需要监听的fd所对应的等待队列,然后在没有可用事件返回的情况下才进入睡眠(这是在select/poll的系统调用函数中去睡眠的,不是在驱动的poll过程中)。直到fd有事件发生时,会将等待队列中的调用poll的这个进程唤醒。这个进程再重新poll全部的fd,以获取事件。
所以,在驱动的poll过程中,需要做的两件事情是:将当前进程加入等待队列(以便后续事件到来时唤醒之)、返回当前的事件信息。至于睡眠,那是上层调用者关心的事……

霞映澄塘 2022-09-25 19:08:36

“如果前一个poll_wait进入睡眠的话,第二个poll_wait就被阻塞了,所以应该不是这样”

poll_wait(filp, &dev->inq, wait);
上面队列应该是对应于一个起程,如果如果阻塞的话,它会将对应此队列的进程就会被挂起,加入该队列待候。等到该文件再次动作的时候再POLL整个过程。
---------------------------------------------------------------------------
poll_wait(filp, &dev->outq, wait);
这个又是对应用于另外一个进程。

这个程序的本意应该是:两者的进程队列是分开的!各对应各的!不管最后文件再次动作,整个POLL过程再一次动行!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文