当前位置: 技术问答>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;
}
这是什么原因造成的?
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返回时将再次循环检测是否有操作可以进行,如此反复。
select/poll会在一个循环中对每个需要监听的设备调用它们自己的poll支持函数以使得当前任务被加入各个设备的等待列表,若当前没有任何被监听的设备就绪,则调用schedule主动让出cpu,否则select/poll返回;schedule返回时将再次循环检测是否有操作可以进行,如此反复。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。