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

相关文章

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 文件复制 字符编码内存操作流(

C++ I/O多路复用 select / poll / epoll

I/O多路复用:在网络I/O中,用 1个或1组线程 管理 多个连接描述符。             如果有至少一个描述符准备就绪,就处理对应的事件             如果没有,就会被阻塞,让出CPU给其他应用程序运行,直到有准备就绪的描述符 或 超时

Go Select的实现

select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局 了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导

Go 语言中Select与for结合使用break

func test(){i := 0for {select {case <-time.After(time.Second * time.Duration(2)):i++if i == 5{fmt.Println("break now")break }fmt.Println("inside the select: ")}fmt.Println("inside the for: ")}} 执行后

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E