刚刚了解了linux下select系统调用,函数原型是

 #include <sys/select.h>
#include <sys/time.h>
int
select(int maxfdpl, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

如何给readset, writeset, exceptset这3个参数中的每一个参数指定一个或多个描述符是一个设计上的问题。select使用描述符集,通常是一个整数数组,其中每一个整数中的每一位对应一个描述符。举例来说,假设使用32位整数,那么该数组的第一个元素对应于描述符0-31,第二个元素对应于32-63,依此类推。隐藏在名为fd_set的数据类型和以下四个宏:

 void FD_ZERO(fd_set *fdset);
void FD_SET(int fd, fd_set *fdset);
void FD_CLR(int fd, fd_set *fdset);
int FD_ISSET(int fd, fd_set *fdset);

宏FD_SET设置文件描述符集fdset中对应于文件描述符fd的位(设置为1),宏FD_CLR清除文件描述符集fdset中对应于文件描述符fd的位(设置为0),宏FD_ZERO清除文件描述符集fdset中的所有位(即把所有位都设置为0)。使用这3个宏在调用select前设置描述符屏蔽位。因为这3个描述符集参数是值-结果参数,在调用select后,结果指示哪些描述符已就绪。使用FD_ISSET来检测文件描述符集fdset中对应于文件描述符fd的位是否被设置。描述符集内任何与未就绪描述符对应的位返回时均清成0,为此,每次重新调用select函数时,必须再次把所有描述符集内所关心的位置1.

通常,操作系统通过宏FD_SETSIZE来声明在一个进程中select所能操作的文件描述符的最大数目。许多系统实现有类似下面的声明,取自4.4BSD的<sys/types.h>:

 #ifndef FD_SETSIZE
#define FD_SETSIZE 256
#endif

不过,更新的源自BSD的内核和源自SVR4的内核把它放在头文件<sys/select.h>中。

在linux下<sys/select.h>头文件中,是这样描述的:

 /* Maximum number of file descriptors in `fd_set`. */
#define FD_SETSIZE _FD_SETSIZE

_FD_SETSIZE定义在/usr/include/linux下的posix_types.h中:

 /*
*This macro may hava been defined in <gnu/types.h>. But we always use the one here.
*/
#undef _FD_SETSIZE
#define _FD_SETSIZE 1024

我们可以把FD_SETSIZE定义为某个更大的值以增加select所用描述符集的大小。不幸的是,这样做通常行不通。因为select是在内核中实现的,并把内核的FD_SETSIZE定义为上限使用。因此,增大FD_SETSIZE还要重新编译内核。值得注意的是,有些应用程序开始使用poll代替select,这样可以避开描述符有限问题。另为,select的典型实现在描述符数增大时可能存在扩展性问题。

有些厂家正在将select的实现修改为允许进程将FD_SETSIZE定义为比默认值更大的某个值,例如BSD/OS。然而,从程序的可移植性考虑,不建议这样使用。

最新文章

  1. ORACLE定期清理INACTIVE会话
  2. URLDecoder解析url编码
  3. python27(32位)安装模块报错“error: Unable to find vcvarsall.bat”
  4. JAVA Day3
  5. Python的平凡之路(2)
  6. iOS开发——面试笔试精华(三)
  7. asp.net动态设置button的Text,Enabled属性,向后台传递参数
  8. 分享UI设计模型
  9. IT连创业系列:产品设计之答题模块
  10. 18.21 关键字extern
  11. day 48-css-part1
  12. 搭建svn服务器的坑
  13. spark-sql中的DataFrame文件格式转储示例
  14. Curator的监听
  15. 学习-工作:GTD
  16. effective C++学习三(仅供个人学习记录,本文摘录effective C++)
  17. JavaScript 获取鼠标点击位置坐标
  18. 在Oracle中实现每日表备份并删除7天前的备份表
  19. AC日记——[Sdoi2010]粟粟的书架 bzoj 1926
  20. 第一次C语言作业:博客随笔

热门文章

  1. Kafka logo分布式发布订阅消息系统 Kafka
  2. hdu 1159 Common Subsequence (dp乞讨LCS)
  3. oracle connect by 说明
  4. 【 D3.js 入门系列 --- 10.2 】 你可以拖动地图
  5. SharePoint 2013 中将 HTML文件转换为母版页
  6. 记录这一刻:百度搜索结果“文件格式:-HTML文本”
  7. Angular绑定数据时转义html标签
  8. 使用SeekBar办Android调色板
  9. SEO要领:8文章主持技巧(两)
  10. 经典算法题每日演练——第十四题 Prim算法