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