fd_set 详解

来源:互联网 发布:富途牛牛 mac 编辑:程序博客网 时间:2024/06/09 23:59
系统提供了4个宏对描述符集进行操作:#include <sys/select.h>#include <sys/time.h>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。假设执行如下程序后:#include <sys/select.h>#include <sys/time.h>fd_set readset;FD_ZERO(&readset);FD_SET(5, &readset);FD_SET(33, &readset);则文件描述符集readset中对应于文件描述符6和33的相应位被置为1,如图1所示:再执行如下程序后:FD_CLR(5, &readset);则文件描述符集readset对应于文件描述符6的相应位被置为0,如图2所示:通常,操作系统通过宏FD_SETSIZE来声明在一个进程中select所能操作的文件描述符的最大数目。例如:在4.4BSD的头文件中我们可以看到:#ifndef FD_SETSIZE#define FD_SETSIZE 1024#endif在红帽Linux的头文件<bits/types.h>中我们可以看到:#define __FD_SETSIZE 1024以及在头文件<sys/select.h>中我们可以看到:#include <bits/types.h>#define FD_SETSIZE __FD_SETSIZE既定义FD_SETSIZE为1024,一个整数占4个字节,既32位,那么就是用包含32个元素的整数数组来表示文件描述符集。我们可以在头文件中修改这个值来改变select使用的文件描述符集的大小,但是必须重新编译内核才能使修改后的值有效。当前版本的unix操作系统没有限制FD_SETSIZE的最大值,通常只受内存以及系统管理上的限制。
0 0
原创粉丝点击