`
llsundry
  • 浏览: 3107 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

POSIX select fd_set实现

阅读更多
// * 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 // 最多等待时间
	);


 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics