`
kenby
  • 浏览: 725441 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

I/O 多路转接 select 的使用

 
阅读更多

select使用的一般步骤:

1 清空fd_set

2 把描述符加入fd_set

3 调用select,更新所有描述符的状态

4 依次检测每个描述符,若可读或者可写,则从描述符中读/写数据

5 每次select之前都要重新对fd_set清零,并把关心的描述符重新加进去

 

错误的做法:

fd_set	set;
ct timeval tv = {3, 0};

fd[n] = {1,2,3,4,5};	/* 文件描述符列表 */
maxfd = max{ fd[i], 0<=i<=n };	/* 求最大的描述符 */
FD_ZREO(&set);
for (i = 0; i < n; i++) {
	FD_SET(fds[i], set);	/* 所有描述符都加入 */
}

//select返回后在依次检查每个描述符
if (select(maxfd+1, &set, NULL, NULL, &tv)  > 0) {
	for (i = 0; i < n; i++) {
		if (FD_ISSET(fd[i], &set)) {	/* 可以读 */
			read data from fd[i]...
		}
	}
}

FD_CLR(1, &set);
FD_CLR(2, &set);
FD_CLR(3, &set);
//select返回后在依次检查每个描述符
if (select(maxfd+1, &set, NULL, NULL, &tv)  > 0) {
	for (i = 0; i < n; i++) {
		if (FD_ISSET(fd[i], &set)) {	/* 可以读 */
			read data from fd[i]...
		}
	}
}

 

正确的做法:

fd_set	set;
struct timeval tv = {3, 0};

fd[n] = {1,2,3,4,5};	/* 文件描述符列表 */
maxfd = max{ fd[i], 0<=i<=n };	/* 求最大的描述符 */
FD_ZREO(&set);
for (i = 0; i < n; i++) {
	FD_SET(fds[i], set);	/* 所有描述符都加入 */
}

//select返回后在依次检查每个描述符
if (select(maxfd+1, &set, NULL, NULL, &tv)  > 0) {
	for (i = 0; i < n; i++) {
		if (FD_ISSET(fd[i], &set)) {	/* 可以读 */
			read data from fd[i]...
		}
	}
}

fd[n] = {4,5};	/* 文件描述符列表 */
maxfd = max{ fd[i], 0<=i<=n };	/* 求最大的描述符 */
FD_ZREO(&set);
for (i = 0; i < n; i++) {
	FD_SET(fds[i], set);	/* 所有描述符都加入 */
}
//select返回后在依次检查每个描述符
if (select(maxfd+1, &set, NULL, NULL, &tv)  > 0) {
	for (i = 0; i < n; i++) {
		if (FD_ISSET(fd[i], &set)) {	/* 可以读 */
			read data from fd[i]...
		}
	}
}
 
分享到:
评论

相关推荐

    I/O多路转接之select

    在本例中,我们将聚焦于"I/O多路转接之select",这是一种在Unix-like系统中广泛使用的机制。"select"函数是实现这一功能的核心,它允许程序员在一个进程内同时处理多个输入/输出流,提高了程序的效率和响应性。 ...

    I:O多路复用(多路转接)1

    总结起来,I/O多路复用是Linux系统中处理并发I/O的关键技术,通过select、poll和epoll等方式,可以在单个进程内高效地管理大量并发连接,降低CPU和内存消耗,提高系统的整体性能和可伸缩性。在选择哪种多路复用方式...

    Unix环境高级编程

    I/O多路转接(Multiplexing)是处理多个I/O操作的有效方法,其中`select`和`poll`是最常用的两种实现方式。这些函数允许一个进程监控多个文件描述符,当其中一个描述符变为可读或可写时,函数会返回,从而避免了进程...

    linux_kernel

    至于I/O多路转接SELECT编程,这是网络编程中的一个重要概念。`select()`函数允许程序同时监控多个文件描述符,等待它们就绪后再进行处理。这在处理大量并发连接时非常有用,因为它能避免阻塞在一个文件描述符上。...

    12 - tcp状态转换-select-poll.pdf

    IO多路转接可以使用select、poll和epoll函数来实现。select函数可以监听多个文件描述符,但是它的缺点是只能监听1024个文件描述符。poll函数可以监听多个文件描述符,并且可以监听更多的文件描述符。但是,它的缺点...

    第3讲_高级文件IO

    I/O多路转接是一种高效处理多个文件的方法。`select()`函数是实现这一功能的关键。它允许程序监控多个文件描述符的状态变化,并在某个或某些文件描述符准备好读写操作时返回。通过调用`select()`函数,可以同时监视...

    UNIX环境高级编程_第二版中文

    14.5 I/O多路转接  14.5.1 select和pselect函数  14.5.2 poll函数  14.6 异步I/O  14.6.1 系统V异步I/O  14.6.2 BSD异步I/O  14.7 readv和writev函数  14.8 readn和writen函数  14.9 存储映射I/O ...

    UNIX环境高级编程

    12.5 I/O多路转接 12.5.1 select函数 12.5.2 poll函数 12.6 异步I/O 12.6.1 SVR4 12.6.2 4.3+BSD 12.7 readv和writev函数 12.8 readn和 writen函数 12.9 存储映射I/O 12.10 小结 习题 第13章 精灵进程 13.1 引言 ...

    UNIX环境高级编程(第二版中文)

    14.5 I/O多路转接 379 14.5.1 select和pselect函数 381 14.5.2 poll函数 384 14.6 异步I/O 386 14.6.1 系统V异步I/O 386 14.6.2 BSD异步I/O 387 14.7 readv和writev函数 387 14.8 readn和writen函数...

    android phone流程

    - Unix I/O 多路转接:如 `select()` 或 `poll()` 系统调用,用于等待多个 I/O 描述符的就绪状态。 5. **移植 RIL** - RIL 的移植涉及到适配不同厂商的无线电硬件,需要理解硬件接口并实现相应的 AT 指令集。 - ...

    unix环境编程电子书

    354 第14章 高级I/O 355 14.1 引言 355 14.2 非阻塞I/O 355 14.3 记录锁 357 14.4 STREAMS 370 14.5 I/O多路转接 379 14.5.1 select和pselect函数 381 14.5.2 poll函数 384 14.6 异步I/O 386 ...

    Linux网络编程socket编程学习

    自学Linux网络编程关于socket...重点介绍多路I/O转接服务器的实现,包括select函数poll函数epoll函数;最后介绍了UDP协议的服务器编写和本地套接字的程序实现。资源里面有笔记,C语言代码,参考书及参考书包含的程序。

    APUE读书笔记(Unix高级环境编程)

    - **I/O多路转接**:如`select`和`poll`函数可以监控多个文件描述符。 - **异步I/O**:允许在I/O操作完成时接收通知。 - **readv(2)和writev(2)**:使用散列列表进行I/O操作。 - **存储映射I/O**:直接操作内存中的...

    Android中RIL层详细分析.pdf

    * Unix 下 I/O 多路转接是指在 Unix 操作系统中实现 I/O 多路转接的机制。 Android 中 RIL 层是 Android 操作系统中的一层 middleware,负责将无线硬件设备与电话服务之间的抽象层,具有重要的实践价值和理论意义。

    IT行业中必备技能之UNIX最佳学习资料

    12.5 I/O多路转接 296 12.5.1 select函数 298 12.5.2 poll函数 301 12.6 异步I/O 303 12.6.1 SVR4 303 12.6.2 4.3+BSD 303 12.7 readv和writev函数 304 12.8 readn和writen函数 306 12.9 存储映射I/O 307 12.10 小结...

    UNIX环境高级编程_第2版.part1

    14.5 i/o多路转接379 14.5.1 select和pselect函数381 14.5.2 poll函数384 14.6 异步i/o 386 14.6.1 系统v异步i/o 386 14.6.2 bsd异步i/o 387 14.7 readv和writev函数387 14.8 readn和writen函数389 14.9 ...

Global site tag (gtag.js) - Google Analytics