分类: 嵌入式
2015-04-04 19:29:37
函数原型:int poll(struct pollfd *fds ,nfds_t nfds ,int timeout);
fds为指向待查询的设备文件数组;
nfds描述第一个参数fds中有多少个设备;
timeout为查询不到我们期望的结果进程睡眠的时间;
返回值:查询到期望状态的设备文件个数
struct pollfd {
int fd; /* 文件描述符 */ (待查询的设备)
short events; /* 等待的事件 */(待查询的设备的状态)
short revents; /* 实际发生了的事件 */
}
总的来说,Poll提供的接口工作机制如下:
应用程序中调用poll查询文件的状态,首先将fds里面的每个设备文件fd取出,调用它们驱动程序的poll函数,查询是否出现我们期望状态,查询完fds里面所有的设备文件得到满足期望状态的设备文件的数量,如果这个数为0,则poll调用将导致进程就进入睡眠状态,睡眠时间由poll函数设定,如果程序在睡眠状态中fds的某个文件出现我们期望状态,那么poll立即返回,否则一直睡眠到睡眠时间结束为止,返回值为0;如果这个数大于0 ,poll返回满足条件的设备数量。
poll相当于open("/dev/xxx",O_RDWR)阻塞打开文件,区别在于当设备文件无数据可读时poll只导致程序休眠固定时间,而open将导致程序一直休眠到有数据为止。
至于更为详细的内核代码分析,抓住如下主线即可明白了,
(应用程序)poll->sys_poll->do_sys_poll->do_poll->do_pollfd->f_op->poll(驱动)
这里不再贴
二、驱动程序
驱动程序里与poll相关的地方有两处:
一是构造file_operation结构时,要定义自己的poll函数。
二是在poll函数中通过poll_wait来调用上面说到的__pollwait函数