新手请教关于poll方法的问题
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你这样肯定不对了,要么再一个函数中进行out和in的poll检查(这个我不sure是否可以);
要么fork一个进程,两个进程各自自己的poll,这样岂不是就ok了
poll_wait 仅仅是将当前进程加入等待队列,并不会进入睡眠。
在系统调用select/poll中,会把当前进程加入所有需要监听的fd所对应的等待队列,然后在没有可用事件返回的情况下才进入睡眠(这是在select/poll的系统调用函数中去睡眠的,不是在驱动的poll过程中)。直到fd有事件发生时,会将等待队列中的调用poll的这个进程唤醒。这个进程再重新poll全部的fd,以获取事件。
所以,在驱动的poll过程中,需要做的两件事情是:将当前进程加入等待队列(以便后续事件到来时唤醒之)、返回当前的事件信息。至于睡眠,那是上层调用者关心的事……
“如果前一个poll_wait进入睡眠的话,第二个poll_wait就被阻塞了,所以应该不是这样”
poll_wait(filp, &dev->inq, wait);
上面队列应该是对应于一个起程,如果如果阻塞的话,它会将对应此队列的进程就会被挂起,加入该队列待候。等到该文件再次动作的时候再POLL整个过程。
---------------------------------------------------------------------------
poll_wait(filp, &dev->outq, wait);
这个又是对应用于另外一个进程。
这个程序的本意应该是:两者的进程队列是分开的!各对应各的!不管最后文件再次动作,整个POLL过程再一次动行!