Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42440
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 9
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-20 12:35
文章分类
文章存档

2016年(5)

2015年(5)

我的朋友

分类: LINUX

2015-12-29 16:23:48

原文地址:poll_wait函数 作者:fzhman

原文地址 http://www.cnblogs.com/hanyan225/archive/2010/10/13/1850497.html


“小王,来聊聊,今天面试的情况怎么样,应该挺顺利的吧..”看着小王平淡的眉头,我问道。

“唉,别提了,你说,我的运气咋这差呢,面试前你不是给我讲了有关阻塞的问题吗,我见了面试官是吧,还跟他好好的用今天排队的例子说了有关阻塞的问题,但是..”小王哀声叹气地说到。

“别但是了,怎么啦..”

“可问题是面试官压根就没打算问我有关阻塞的问题及解决方案,但是问我说:这样吧,你给我说说在Linux设备驱动中有关非阻塞的方法,我这一听,傻眼了不是,你刚好给我讲的是阻塞的东西,可人家偏要问我有关非阻塞的问题,我..”小王欲哭无泪啊..

“怎么这样呢,算了,机会多的是,亡羊补牢,我现在就给你说说有关非阻塞的问题----Linux设备驱动程序之阻塞非阻塞IO----轮询操作”。

通过上一节,我们都明白了,有关阻塞的相关知识(不知道,那我没辙了,饭送到嘴,你还挑食,难不成我拿把起子把嘴撬开不成,自己看上一篇吧),现在就来聊聊对

立面非阻塞。

使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞的访问,这两个系统调用最终又会引发设备驱动中的poll()函数被执行

所以我们的问题就集中到了如何编写设备驱动中的poll()函数就可以了。二话不说,先来看看设备驱动中的poll()函数原型:

unsigned int (*poll)(struct file *filp, struct poll_table *wait);

这个函数要进行下面两项工作。首先,对可能引起设备文件状态变化的等待队列调用poll_wait(),将对应的等待队列头添加到poll_table.然后,返回表示是否能对设备进行无阻塞读写访问的掩码。在上面提到了一个poll_wait()函数,它的原型:

void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table *wait);

它的作用就是把当前进程添加到wait参数指定的等待列表(poll_table)中。需要注意的是这个函数是不会引起阻塞的,呵呵,谁给它取得个名字带wait的,给咱们添这么多麻烦。

“等等,你先停停,你是高手,我可是菜鸟呢,你先给我说说poll_table结构吧,心里总是想它是什么..”小王打断我道。

行行,说起这个结构,我也是费了一番周折,它定义在““,具体如下:

typedef struct poll_table_struct { poll_queue_proc qproc; unsigned long key; } poll_table; 看看,其实没什么吧,不要想的太复杂了经过以上驱动程序的poll()函数应该返回设备资源的可获取状态,即POLLIN,POLLOUT,POLLPRI,POLLERR,POLLNVAL等宏的位"或"结果.每个宏的含义都表示设备的一种状态,如:
常量说明
POLLIN普通或优先级带数据可读
POLLRDNORM普通数据可读
POLLRDBAND优先级带数据可读
POLLPRI高优先级数据可读
POLLOUT普通数据可写
POLLWRNORM普通数据可写
POLLWRBAND优先级带数据可写
POLLERR发生错误
POLLHUP发生挂起
POLLNVAL描述字不是一个打开的文件
"小王,你明白了没.."看着小王眨巴眨巴的小眼睛,我说。"呵呵,你干脆给我来个典型模板,行不?"小王苛求道。行,没问题,你现在特殊时期,我是有求必应。请看下边:
阅读(1212) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~