IO多路复用--select

2024-06-15 03:32
文章标签 select io 多路复用

本文主要是介绍IO多路复用--select,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IO多路复用,就是在多个文件描述符上阻塞,并在其中某个fd能用的时候收到通知。

其设计原则是

1: 任何文件描述符准备好IO的时候就告诉我;

2.在没有文件描述符就绪的时候睡觉,这样也不会因为IO而把程序憋死。

3. 在不阻塞的情况下处理所有有收到通知的fd。

常见的方式就是select,poll , epoll。它们有个好处就是可以设置超时,尤其在通讯的IO方面很方便。

 

函数的造型是 int select(int n,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);

它包含了三个集合,readfds,writefds,errorfds,用户把想监听的fd放入其中,想监听可读信号就仍readfds里面。

然后当你输入的时候内核就通知,用这个宏FD_ISSET(fd,&readfds)来看看fd在不在这个集合里面要在,妥了,直接开始读

示例程序:它监听输出和输入,但是只有你输入一个啥玩意的时候程序才接到消息,不输入它里面没东西,就没法读。

#include<stdio.h>    //printf
#include<sys/time.h>    //struct timeval
#include<sys/select.h>
#include<unistd.h>   //STDOUT_FILENO
#define TIMEOUT  5
#define BUF_LEN  1024
int main(void)
{
struct timeval tv;
fd_set readfds;
fd_set writefds;
int ret;
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO,&readfds);
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
int i = 0;
ret = select(STDIN_FILENO+1,&readfds,NULL,NULL,&tv);
if(ret == -1){
perror("select");
return 1;
}else if(!ret){
printf("%d second elapsed.\n",TIMEOUT);
return 0;
}
if(FD_ISSET(STDIN_FILENO,&readfds)){
char buf[BUF_LEN+1];
int len;
len = read(STDIN_FILENO,buf,BUF_LEN);
if(len == -1){
perror("read");
return 1;
}
if(len){
buf[len]='\0';
printf("read : %s\n",buf);
}
return 0;
}


但是select有它性能上的不足,而且也有监听文件上限的不足,当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小,当监听的文件太多了,复制,遍历一遍的开销也不小。但是它的跨平台性是最好的,若一定要用这个,就用多线程来做,每个线程里面分配小于1024个。

这篇关于IO多路复用--select的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062308

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(