Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4203468
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类: C/C++

2009-08-21 08:57:38

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

    宏FD_SET设置文件描述符集fdset中对应于文件描述符fd的位(设置为
1),宏FD_CLR清除文件描述符集fdset中对应于文件描述符fd的位(设
置为0),宏FD_ZERO清除文件描述符集fdset中的所有位(既把所有位都
设置为0)。使用这3个宏在调用select前设置描述符屏蔽位, 在调用
select后使用FD_ISSET来检测文件描述符集fdset中对应于文件描述符
fd的位是否被设置。

    过去,描述符集被作为一个整数位屏蔽码得到实现,但是这种实现对于多于
32个的文件描述符将无法工作。描述符集现在通常用整数数组中的位域表示
,数组元素的每一位对应一个文件描述符。例如,一个整数占32位,那么整
数数组的第一个元素代表文件描述符0到31,数组的第二个元素代表文件描
述符32到63,以此类推。宏FD_SET设置整数数组中对应于fd文件描述符
的位为1,宏FD_CLR设置整数数组中对应于fd文件描述符的位为0,宏
FD_ZERO设置 整数数组中的所有位都为0。

通常,操作系统通过宏FD_SETSIZE来声明在一个进程中select所能操作
的文件描述符的最大数目。例如:
在4.4BSD的头文件中我们可以看到:
#ifndef FD_SETSIZE
#define FD_SETSIZE 1024
#endif
在红帽Linux的头文件中我们可以看到:
#define __FD_SETSIZE 1024
以及在头文件中我们可以看到:
#include
#define FD_SETSIZE __FD_SETSIZE
既定义FD_SETSIZE为1024,一个整数占4个字节,既32位,那么就是用
包含32个元素的整数数组来表示文件描述符集。我们可以在头文件中修改

个值来改变select使用的文件描述符集的大小,但是必须重新编译内核才
能使修改后的值有效。当前版本的unix操作系统没有限制
FD_SETSIZE的
最大值,通常只受内存以及系统管理上的限制。
阅读(9505) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~