当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2015-11-04

    本文导语:  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换成interruptib...

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;
}
这是什么原因造成的?

|
poll_wait并不阻塞,而是把当前任务添加到一个在调用poll_wait时带入的参数指定的一个等待列表中,真正的阻塞动作是在select/poll函数中完成的。

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

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3