// * fd_set实现 // * fd_set中保存了位的数组,每一位的索引就是对应的文件描述字。 // 该位为1代表对应的文件描述字在fd_set中;为0则相反。 // * 位数组的实现依靠一个_FdBitsUnit类型的数组, // _FdbitsUnit是一种内置整型(在这里我们将它指定为机器字长), // _FdbitsUnit能存储_bitCountOfFdBitsUnit个位; // 显而易见,该数组的元素个数为FD_SETSIZE / _bitCountOfFdBitsUnit。 // * _FdBitsUnit实现 typedef unsigned int _FdBitsUnit; // * _FdBitsUnit所能容纳的位数 const int _bitCountOfFdBitsUnit = CHAR_BIT * (int)sizeof(_FdBitsUnit); // * [POSIX]fd_set typedef struct { // PRIVATE _FdBitsUnit _fdBits[FD_SETSIZE / _bitCountOfFdBitsUnit]; }fd_set; // * [POSIX]FD_SET #define FD_SET(fd, fdset) \ ((void)(fdset)->_fdBits[(fd / _bitCountOfFdBitsUnit)] |= (_FdBitsUnit)((unsigned)1 << (fd % _bitCountOfFdBitsUnit))) // * [POSIX]FD_CLR #define FD_CLR(fd, fdset) \ ((void)(fdset)->_fdBits[(fd / _bitCountOfFdBitsUnit)] &= ~(_FdBitsUnit)((unsigned)1 << (fd % _bitCountOfFdBitsUnit))) // * [POSIX]FD_ISSET #define FD_ISSET(fd, fdset) \ ((fdset)->_fdBits[(fd / _bitCountOfFdBitsUnit)] & (_FdBitsUnit)((unsigned)1 << (fd % _bitCountOfFdBitsUnit)) == 0) // * [POSIX]FD_ZERO #define FD_ZERO(fdset) \ memset(fdset->_fdBits, 0, sizeof _fdBits * sizeof _fdBits[0]) // * [POSIX]select int select( int nfds, // 等待检查的最大套接字 fd_set *readfds, // 指向一组等待可读性检查的套接字 fd_set *writefds, // 指向一组等待可写性检查的套接字 fd_set *exceptfd, // 指向一组等待错误检查的套接字 const struct timeval *timeout // 最多等待时间 );
POSIX select fd_set实现
猜你喜欢
转载自llsundry.iteye.com/blog/2263131
今日推荐
周排行