`
llsundry
  • 浏览: 3174 次
  • 性别: 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 // 最多等待时间
	);


 

 

分享到:
评论

相关推荐

    IO多路复用之select实例

    int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); ``` - `nfds`: 指定文件描述符集的范围,即最大的文件描述符+1。 - `readfds`: 指向一个fd_set结构体,...

    select函数来实现多路复用输入/输出模型

    `select`函数是实现这一模型的一种常见方法,特别是在古老的Unix系统和POSIX兼容系统中广泛使用。 `select`函数的核心在于它可以监听一组文件描述符集,当这些集合中的任何一成员准备进行读写操作时,`select`会...

    SelectSocket 源码

    `SelectSocket`源码就是对这一功能的实现,它限定了最多可以监控64个socket,这是因为`select`函数的fd_set结构体在32位系统中默认能容纳的描述符数量。 `select`模型的基本工作流程如下: 1. 初始化:程序调用`FD...

    linux多输入输出处理

    `select()`函数的主要限制在于`fd_set`的大小,通常最多支持1024个文件描述符,这是因为早期的实现基于一个`int`类型的位向量。不过,现代系统可能会通过调整`FD_SETSIZE`宏的值来支持更多的文件描述符。在Linux中,...

    主要用于处理网络IO事件基于epoll封装的库和框架 .rar

    因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明: #define __FD_SETSIZE 1024 表示select最多同时监听1024个fd,当然,可以...

    HelloSocket结构优化版本_needs9wd_Select网络编程接口学习_

    5. **性能优化**:使用`Select`时,需要注意其性能瓶颈,因为`Select`有一个限制,即可以监控的文件描述符数量不能超过FD_SETSIZE(通常为1024)。对于大型系统,可能需要考虑使用其他如`Poll`或`Epoll`等更高效的...

    select模型

    1. **准备就绪集合**:首先,程序通过`FD_SET`宏将需要监控的套接字添加到三个文件描述符集(readfds, writefds, errorfds)中。 2. **调用select**:然后,调用`select`函数,传入这些集合和超时时间。`select`会...

    Epoll模型1

    在Linux中,select最多只能处理1024个文件描述符(FD),这个限制源自于`FD_SETSIZE`的定义,通常在`linux/posix_types.h`头文件中设定。然而,Epoll不受此限制,它的并发数由系统最大打开文件数决定,通常远大于...

    Serial Programming Guide for POSIX Operating Systems.

    - **使用方法**:结合fd_set结构体和其他辅助函数,实现对串行端口的高效监控。 #### 六、附录 - **Pinouts**:包括RS-232、RS-422等多种串行接口的针脚定义。 - **ASCII控制码**:列出ASCII标准中的控制字符及其...

    五嵌入式文件IO编程.ppt

    `int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);` - `nfds`:最大文件描述符+1。 - `readfds`:要监控的读文件描述符集合。 - `writefds`:要监控的写...

    信号量在LINUX系统I^2C驱动程序的应用.pdf

    然而,如果存在多个设备同时发送SIGIO信号,用户进程无法区分信号来源,通常需要借助poll或select函数来确定数据来源。作者研究发现,通过POSIX扩展后的信号机制,使用sigaction函数可以传递文件句柄,从而使得用户...

    Linux系统编程笔记

    int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); ``` - **作用**:用于监控多个文件描述符的读写事件。`nfds`指定最大文件描述符加一,`readfds`、`...

    C++教程网视频:linux网络编程

    - **select限制**:最多只能监控FD_SETSIZE个文件描述符。 - **poll**:与select类似,但没有文件描述符数量限制。 ##### socket编程(十三) - **epoll使用**:高效的I/O多路复用机制。 - **epoll与select、poll...

    2009 达内Unix学习笔记

    集合了 所有的 Unix命令大全 ...telnet 192.168.0.23 自己帐号 sd08077-you0 ftp工具 192.168.0.202 tools-toolss ... 各个 shell 可互相切换 ksh:$ sh:$ csh:guangzhou% bash:bash-3.00$ ... 命令和参数之间必需用空格隔...

    UNIX环境高级编程英文第三版+源码

    4.4 Set-User-ID and Set-Group-ID 98 4.5 File Access Per missions 99 4.6 Ownership of New Files and Directories 101 4.7 access and faccessat Functions 102 4.8 umask Function 104 4.9 chmod, fchmod, and ...

Global site tag (gtag.js) - Google Analytics