zoukankan      html  css  js  c++  java
  • [转载] Linux poll机制

    原地址:http://hongwazi.blog.163.com/blog/#m=0&t=3&c=poll

    poll的是一种查询的方式,英文解释 :民意调查

    函数原型:int poll(struct pollfd    *fds ,nfds_t    nfds ,int    timeout);

    fds为指向待查询的设备文件数组;

    nfds描述第一个参数fds中有多少个设备;

    timeout为查询不到我们期望的结果进程睡眠的时间;

    返回值:查询到期望状态的设备文件个数

    struct pollfd {     

                             int fd;              /* 文件描述符 */ (待查询的设备)

                       short events;   /* 等待的事件 */(待查询的设备的状态)

                       short revents;  /* 实际发生了的事件 */

                  }

    功能过程描述:应用程序中调用poll查询文件的状态,首先将fds里面的每个设备文件fd取出,调用它们驱动程序的poll函数,查询是否出现我们期望状态,查询完fds里面所有的设备文件得到满足期望状态的设备文件的数量,如果这个数为0,则poll调用将导致进程就进入睡眠状态,睡眠时间由poll函数设定,如果程序在睡眠状态中fds的某个文件出现我们期望状态,那么poll立即返回,否则一直睡眠到睡眠时间结束为止,返回值为0;如果这个数大于0 ,poll返回满足条件的设备数量。

    poll相当于open("/dev/xxx",O_RDWR)阻塞打开文件,区别在于当设备文件无数据可读时poll只导致程序休眠固定时间,而open将导致程序一直休眠到有数据为止。

    二、poll应用举例

    int main(int argc, char **argv)

    {

          int fd;

          unsigned char key_val;

          int ret;

          struct pollfd fds[1];//查询数组的大小,这里我们仅查询一个设备文件

          fd = open("/dev/buttons", O_RDWR);

          if (fd < 0)

              printf("can't open! ");

          fds[0].fd     = fd;//查询的设备文件描述符为fd,也就是查询的设备是/dev/buttons

          fds[0].events = POLLIN;//查询事件是POLLIN,也就是/dev/buttons是否按下

          while (1)

          {     

               ret = poll(fds, 1, 5000);//查询的设备队列是fds,里面有1个设备,查询不到就睡眠5s,在睡眠中如果有期望状态出现也是可以返回

               if (ret == 0)    

                  printf("time out "); //没有查询到按键按下,睡眠中也没有按键按下

               else

                  {    

                      read(fd, &key_val, 1);           //查询到按键按下,读取这个按键的值

                      printf("key_val = 0x%x ", key_val);

                  }

          }

              return 0;

    }

     


  • 相关阅读:
    (最小生成树) 畅通工程再续 -- HDU --1875
    (最小生成树)Jungle Roads -- HDU --1301
    (最小生成树 )还是畅通工程 -- HDU--1233
    不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】
    我们应当怎样做需求分析【转】
    C# DataTable几个常用的查询表达式【转】
    C# DataTable转实体 通用方法【转】
    C# 如何利用反射来加载程序集,并调用程序集中有关类的方法【转】
    IEnumerable和IEnumerator 详解 【转】
    循环对XML文档添加Attribute以及移除Element 【转】
  • 原文地址:https://www.cnblogs.com/icemoon1987/p/3149405.html
Copyright © 2011-2022 走看看