Horizon2012 发表于 2011-09-18 22:13

关于驱动程序中的poll

本帖最后由 Horizon2012 于 2011-09-18 22:15 编辑


看[设备驱动开发详解] 的poll函数实现时,有点疑惑:

书本写到poll函数的实现格式大概是这样的:

int mask=0
....
poll_wait()    // 加等待队列头到poll_table
...
if condition   
    mask=...   // 标志
if conditon
    mask=...

return mask

我看了网上的解释,说poll_wait() 不会导致阻塞,真正的阻塞在上层,根据poll函数的返回值来决定是否阻塞,然后如果等待队列头给wake的话,就会再次调用poll函数(不知道是不是真的这样呢?),如果是这样的话,那不是poll_wait就会多次调用了吗?多次加等待队列头到poll_table?

zhuqing_739 发表于 2012-08-31 10:19

同样很困惑这个问题啊?????

xiaoqiang_linux 发表于 2012-09-07 09:22

我个人的理解是:应用层调用select函数,会调用驱动层的poll,当poll函数的掩码值mask返回0时候,此时上层的select就会阻塞,但是poll函数并没有阻塞,因为他的任务只是添加等待队列头到poll_wait(),并返回掩码值mask,送到应用层;此时如果设备可读或可写(通过应用层对设备节点读写或者其他方式),poll函数又被重新调用,添加等待队列头(等待队列头也可能不止一个,读和写两个,甚至更多),返回掩码值mask就是非0,报到应用层,select就被重新调用了。因此说“poll_wait() 不会导致阻塞,真正的阻塞在上层”
页: [1]
查看完整版本: 关于驱动程序中的poll