poll_wait无法阻塞是什么原因造成的?

kevlin 2005-12-30 11:18:32
static DECLARE_WAIT_QUEUE_HEAD(WaitQ);
static unsigned int device_poll(struct file *filp, poll_table *wait)
{
unsigned int mask=0;
poll_wait(filp,&WaitQ,wait);
mask|=POLLIN|POLLRDNORM;
return mask;
}

无法阻塞,如果将poll_wait换成interruptible_sleep_on就可以完成阻塞了
static unsigned int device_poll(struct file *filp, poll_table *wait)
{
unsigned int mask=0;
interruptible_sleep_on(&WaitQ);
mask|=POLLIN|POLLRDNORM;
return mask;
}
这是什么原因造成的?
...全文
1197 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzx1983 2006-01-02
  • 打赏
  • 举报
回复 1
因此你需要在你的poll支持函数中判断是否就绪并返回相应的值,像你这样直接就返回一个必定带有POLLIN|POLLRDNORM的返回值,select/poll当然就认为是就绪而返回了,这就是不能阻塞的原因。
yzx1983 2006-01-02
  • 打赏
  • 举报
回复 2
poll_wait并不阻塞,而是把当前任务添加到一个在调用poll_wait时带入的参数指定的一个等待列表中,真正的阻塞动作是在select/poll函数中完成的。

select/poll会在一个循环中对每个需要监听的设备调用它们自己的poll支持函数以使得当前任务被加入各个设备的等待列表,若当前没有任何被监听的设备就绪,则调用schedule主动让出cpu,否则select/poll返回;schedule返回时将再次循环检测是否有操作可以进行,如此反复。
kevlin 2005-12-30
  • 打赏
  • 举报
回复
没人知道为什么吗

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧