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",这是一种在Unix-like系统中广泛使用的机制。"select"函数是实现这一功能的核心,它允许程序员在一个进程内同时处理多个输入/输出流,提高了程序的效率和响应性。 ...
总结起来,I/O多路复用是Linux系统中处理并发I/O的关键技术,通过select、poll和epoll等方式,可以在单个进程内高效地管理大量并发连接,降低CPU和内存消耗,提高系统的整体性能和可伸缩性。在选择哪种多路复用方式...
I/O多路转接(Multiplexing)是处理多个I/O操作的有效方法,其中`select`和`poll`是最常用的两种实现方式。这些函数允许一个进程监控多个文件描述符,当其中一个描述符变为可读或可写时,函数会返回,从而避免了进程...
至于I/O多路转接SELECT编程,这是网络编程中的一个重要概念。`select()`函数允许程序同时监控多个文件描述符,等待它们就绪后再进行处理。这在处理大量并发连接时非常有用,因为它能避免阻塞在一个文件描述符上。...
IO多路转接可以使用select、poll和epoll函数来实现。select函数可以监听多个文件描述符,但是它的缺点是只能监听1024个文件描述符。poll函数可以监听多个文件描述符,并且可以监听更多的文件描述符。但是,它的缺点...
I/O多路转接是一种高效处理多个文件的方法。`select()`函数是实现这一功能的关键。它允许程序监控多个文件描述符的状态变化,并在某个或某些文件描述符准备好读写操作时返回。通过调用`select()`函数,可以同时监视...
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 ...
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 引言 ...
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函数...
- Unix I/O 多路转接:如 `select()` 或 `poll()` 系统调用,用于等待多个 I/O 描述符的就绪状态。 5. **移植 RIL** - RIL 的移植涉及到适配不同厂商的无线电硬件,需要理解硬件接口并实现相应的 AT 指令集。 - ...
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...重点介绍多路I/O转接服务器的实现,包括select函数poll函数epoll函数;最后介绍了UDP协议的服务器编写和本地套接字的程序实现。资源里面有笔记,C语言代码,参考书及参考书包含的程序。
- **I/O多路转接**:如`select`和`poll`函数可以监控多个文件描述符。 - **异步I/O**:允许在I/O操作完成时接收通知。 - **readv(2)和writev(2)**:使用散列列表进行I/O操作。 - **存储映射I/O**:直接操作内存中的...
* Unix 下 I/O 多路转接是指在 Unix 操作系统中实现 I/O 多路转接的机制。 Android 中 RIL 层是 Android 操作系统中的一层 middleware,负责将无线硬件设备与电话服务之间的抽象层,具有重要的实践价值和理论意义。
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 小结...
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 ...