Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155706
  • 博文数量: 44
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-10 13:28
个人简介

仰望星空

文章分类
文章存档

2016年(22)

2015年(22)

我的朋友

分类: 嵌入式

2015-11-28 22:23:58

一、什么是Poll机制
    根据我自己的理解,Linux下的Poll机制是一种使内核驱动程序主动反馈用户应用程序的手段,有点类似于看门狗(看门狗是如果一段时间不喂狗,系统就会自动重启)。而Poll机制是一到达一定时间或者队列上的驱动被调用了,那么进程就唤醒了。

二、Poll机制的使用方法
    从具体使用的角度来讲可能会更容易接受,一开始就讲原理,可能会迷糊。应用程序中使用的是Poll函数,这个函数的原型如下:
 int poll(struct pollfd fd[], nfds_t nfds, int timeout);
 分析:(1)第一个参数是文件描述符的机构数组,

    一个结构数组,struct pollfd结构如下:

     struct pollfd{

      int fd;              //文件描述符

      short events;    //请求的事件

      short revents;   //返回的事件

  }

        使用的时候是这样使用的, ret = poll(&fds,1,5000); fds.fd = fd fds.events = POLLIN
     然后对ret进行判断,



      当ret == 0时,就证明已将超时了,超啦5000ms。

    (2)第二个参数是指监视的描述符的数目。
    (3)最后一个参数timeout:是一个用毫秒表示的时间,是指定poll在返回前没有接收事件时应该等待时间。如果  它的值为-1,poll就永远都不会超时。如果整数值为32个比特,那么最大的超时周期大约是30分钟。

三、Poll机制对应的驱动函数
      下面是应用程序中的Poll对应的驱动程序,当应用程序中调用Poll函数时,这个函数就会被调用的  

其中poll_wait()函数是通过调用__pollwait()函数来实现的,上面的p->gproc()实际上就上__pollwait()函数,

  从它的代码可知,它只是把当前进程挂入我们驱动程序里定义的一个队列里而已。它的代码如下:

执行到驱动程序的poll_wait函数时,进程并没有休眠,我们的驱动程序里实现的poll函数是不会引起休眠的。让进程进入休眠,是do_sys_pol

l函数的30行“__timeout = schedule_timeout(__timeout)”。

poll_wait只是把本进程挂入某个队列,应用程序调用poll > sys_poll > do_sys_poll > poll_initwait,do_poll > do_pollfd > 我们自己写的poll

函数后,再调用schedule_timeout进入休眠。如果我们的驱动程序发现情况就绪,可以把这个队列上挂着的进程唤醒。可见,poll_wait的作用,只是为了让

驱动程序
能找到要唤醒的进程。即使不用poll_wait,我们的程序也有机会被唤醒:chedule_timeout(__timeout),只是要休眠__time_out这段时间。


 poll()函数经过一系列的函数调用,最终调用的是do_pollfd()函数,这个函数对应的就是驱动里我们注册的函数(?),其源代码如下: 


四、调用整体过程

    通过上边的分析,Poll不是直接调用的,有一个过程:


总结 ::::应用程序调用Poll()函数,然后通过sys_poll>do_sys_poll>do_poll>do_pollfd,而这个do_pollfd就对应于驱动里边的xxx_poll驱

动程序,返回值m
ask非零,count++,记录等待事件发生的进程数。其实在do_poll()之前还有一个poll_initwait(&table),这个是一个初始化。





阅读(2370) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~