免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1741 | 回复: 1
打印 上一主题 下一主题

linux下的poll和select [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-21 09:18 |只看该作者 |倒序浏览

linux下select 和 poll的用法
2009-05-07 20:06
select()函数的作用
      系统调用select和poll的后端实现,用这两个系统调用来查询设备是否可读写,或是否处于某种状态。如果poll为空,则驱动设备会被认为即可读又可写,返回值是一个状态掩码
如何使用select()函数?
      select()函数的接口主要是建立在一种叫'fd_set'类型的基础上。它('fd_set') 是一组文件描述符(fd)的集合。由于fd_set类型的长度在不同平台上不同,因此应该用一组标准的宏定义来处理此类变量:
     fd_set set;
     FD_ZERO(&set);        /* 将set清零 */
     FD_SET(fd, &set);     /* 将fd加入set */
     FD_CLR(fd, &set);     /* 将fd从set中清除 */
     FD_ISSET(fd, &set);   /* 如果fd在set中则真 */
      
在过去,一个fd_set通常只能包含少于等于32个文件描述符,因为fd_set其实只用了一个int的比特矢量来实现,在大多数情况下,检查 fd_set能包括任意值的文件描述符是系统的责任,但确定你的fd_set到底能放多少有时你应该检查/修改宏FD_SETSIZE的值。*这个值是系统相关的*,同时检查你的系统中的select() 的man手册。有一些系统对多于1024个文件描述符的支持有问题。[译者注: Linux就是这样的系统!你会发现sizeof(fd_set)的结果是128(*8 = FD_SETSIZE=1024) 尽管很少你会遇到这种情况。]
select的基本接口十分简单:
     int select(int nfds, fd_set *readset, fd_set *writeset,
                fd_set *exceptset, struct timeval *timeout);
      
其中:
nfds     
      需要检查的文件描述符个数,数值应该比是三组fd_set中最大数
      更大,而不是实际文件描述符的总数。
readset   
      用来检查可读性的一组文件描述符。
writeset
      用来检查可写性的一组文件描述符。
exceptset
      用来检查意外状态的文件描述符。(注:错误并不是意外状态)
timeout
      NULL指针代表无限等待,否则是指向timeval结构的指针,代表最
      长等待时间。(如果其中tv_sec和tv_usec都等于0, 则文件描述符
      的状态不被影响,但函数并不挂起)
      
函数将返回响应操作的对应操作文件描述符的总数,且三组数据均在恰当位置被修改,只有响应操作的那一些没有修改。接着应该用FD_ISSET宏来查找返回的文件描述符组。
这里是一个简单的测试单个文件描述符可读性的例子:
      int isready(int fd)
      {
          int rc;
          fd_set fds;
          struct timeval tv;
   
          FD_ZERO(&fds);
          FD_SET(fd,&fds);
         // tv.tv_sec = tv.tv_usec = 0;
   
//rc = select(fd+1, &fds, NULL, NULL, &tv);
   rc = select(fd+1, &fds, NULL, NULL, NULL);
          if (rc
Linux下select调用的过程:
1.用户层应用程序调用select(),底层调用poll())
2.核心层调用sys_select() ------> do_select()
最终调用文件描述符fd对应的struct file类型变量的struct file_operations *f_op的poll函数。
poll指向的函数返回当前可否读写的信息。
1)如果当前可读写,返回读写信息。
2)如果当前不可读写,则阻塞进程,并等待驱动程序唤醒,重新调用poll函数,或超时返回。
3.驱动需要实现poll函数。
当驱动发现有数据可以读写时,通知核心层,核心层重新调用poll指向的函数查询信息。
poll_wait(filp,&wait_q,wait)    // 此处将当前进程加入到等待队列中,但并不阻塞
在中断中使用wake_up_interruptible(&wait_q)唤醒等待队列


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/105531/showart_2126579.html

论坛徽章:
0
2 [报告]
发表于 2009-12-24 10:52 |只看该作者
不错,加深了我对他们的理解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP