linux - select函数

    技术2023-08-06  79

    #include <sys/time.h> #include <unistd.h> int select(int nfds, fd_set *readset, fd_set *writeset,fd_set* exceptset, struct tim *timeout);

    nfds 需要监听最大的文件描述符+1 (即共监听文件描述符个数)

    readset 可读文件描述符集合

    writeset 可写文件描述符集合

    exceptset 异常文件描述符集合

    timeout 在此时间段内,监听的描述符没有时间发生,则函数返回0; timeout=NULL(阻塞:select将一直被阻塞,直到某个文件描述符上发生了事件) timeout所指向的结构设为非零时间(等待固定时间:如果在指定的时间段里有事件发生或者时间耗尽,函数均返回) timeout所指向的结构,时间设为0(非阻塞:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生)

    fd_set类型的操作宏函数

    //将指定文件描述符集合清空 void FD_ZERO(fd_set *set); //在文件描述符集合中增加一个新的文件描述符 void FD_SET(int fd, fd_set *set); //在文件描述符集合中删除一个文件描述符 void FD_CLR(int fd, fd_set *set); //测试这个文件描述符是否在该文件描述符集合中 int FD_ISSET(int fd, fd_set *set);

    之前 fd_set只用32位的位图,因此最多只能包含32个文件描述符 现在 fd_set使用1024位的位图,因此最多能包含1024个文件描述符

    通常在头文件<sys/select.h>中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量

    在/usr/include/select.h 中 fd_set为如下结构

    typedef struct { #ifdef __USE_XOPEN __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; # define __FDS_BITS(set) ((set)->fds_bits) #else __fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS]; # define __FDS_BITS(set) ((set)->__fds_bits) #endif } fd_set;

    而__fd_mask 是这样被定义的

    typedef long int __fd_mask;

    __FD_SETSIZE宏在posix_types.h被定义为

    #define __FD_SETSIZE 1024

    __NFDBITS在select.h中被定义为

    #define __NFDBITS (8 * (int) sizeof (__fd_mask))

    假设:long int 32位 __NFDBITS = 8*(4字节)=32位 __FD_SETSIZE / __NFDBITS 得到的结果即为:1024位需要多少个__fd_mask组成 因此即可得到结论,在fd_set节后中定义了一个1024位的一个数据结构(由多个元素的__fd_mask类型的数组构成)。

    Processed: 0.010, SQL: 10