Linux--I/O复用之select

目录

一:概念

二:使用

三:参数介绍:

1.ndfs:

2.fd_set类型:

3.readfds:

4.writefds:

5.exceptfds:

6.timeout:

7.返回值:

四:代码main.c


一:概念

I/O 复用使得程序能同时监听多个文件描述符这对提高程序的性能至关重要。通常网络程序在下列情况下需要使用 I/O 复用技术

解析:可以同时监听多个文件描述符上是否有用户感兴趣的事件发生,(先检测谁有数据就绪,只处理这些有数据就绪的)用一个线程来避免阻塞

二:使用

客户端程序要同时处理多个 socket。

客户端程序要同时处理用户输入和网络连接。

TCP 服务器要同时处理监听 socket 和连接 scket。这是 I/0 复用使用最多的场合。

服务器要同时处理 TCP 请求和 UDP 请求。

要同时监听多个端口,或者处理多种服务。

总结:要同时处理两个以上描述符时使用

三:参数介绍:

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

1.ndfs:

等待的文件描述符的最大值+1,

例如:应用进程想要去等待文件描述符3,5,8的事件,则

nfds=max(3,5,8)+1;

2.fd_set类型:

readfds和writefds,exceptfds的类型都是fd_set,那么fd_set类型是什么呢?

fd_set类型本质是一个位图,位图的位置 表示 相对应的文件描述符,内容表示该文件描述符是否有效,1代表该位置的文件描述符有效,0则表示该位置的文件描述符无效。
如果将文件描述符2,3设置位图当中,则位图表示的是为1100。
fd_set的上限是1024个文件描述符。

3.readfds:

readfds是 等待读事件的文件描述符集合,.如果不关心读事件(缓冲区有数据),则可以传NULL值。
应用进程和内核都可以设置readfds,应用进程设置readfds是为了通知内核去等待readfds中的文件描述符的读事件.而 内核设置readfds是为了告诉应用进程哪些读事件生效

4.writefds:

与readfds类似,writefds是等待写事件(缓冲区中是否有空间)的集合,如果不关心写事件,则可以传值NULL。

5.exceptfds:

如果内核等待相应的文件描述符发生异常,则将失败的文件描述符设置进exceptfds中,如果不关心错误事件,可以传值NULL。

6.timeout:

设置select在内核中阻塞的时间,如果想要设置为非阻塞,则设置为NULL。如果想让select阻塞5秒,则将创建一个struct timeval time={5,0};

7.返回值:

  • 如果没有文件描述符就绪就返回0;
  • 如果调用失败返回-1;
  • 如果timeout中中readfds中有事件发生,则返回timeout剩下的时间。

四:代码main.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/select.h>
#include<string.h>
#include<time.h>#define STDIN 0
int main()
{int fd=STDIN;fd_set fdset;while(1){FD_ZERO(&fdset);FD_SET(fd,&fdset);struct timeval tv={5,0};int n=select(fd+1,&fdset,NULL,NULL,&tv);if(n==-1){printf("select err\n");}else if(n==0){printf("timeout\n");}else{if(FD_ISSET(fd,&fdset)){char buff[128]={0};read(fd,buff,127);printf("read:%s\n",buff);}}}
}

运行结果:

没有输入没敲回车,五秒一次超时,键盘输入回车敲后立马读出数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/68737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android FileObserver 的使用与简要原理

FileObserver 是一个 Android 类&#xff0c;用于监视指定文件或目录的更改。它可以帮助开发者实时检测文件或目录的创建、删除、重命名、修改等操作。通过使用 FileObserver&#xff0c;开发者可以及时响应这些文件系统变化&#xff0c;并在相应的事件发生时执行特定的操作。 …

爬虫的工作原理、挑战和应用

什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化程序&#xff0c;它能够在互联网上浏览网页、收集信息并将其存储在本地或其他地方供进一步处理和分析。爬虫通常用于搜索引擎、数据挖掘、内容聚合、价格比较等应用中。 爬虫的工作原理&…

2023年7月京东投影仪行业品牌销售排行榜(京东大数据)

鲸参谋监测的京东平台7月份投影仪行业销售数据已出炉&#xff01; 7月份&#xff0c;投影仪市场呈现增长趋势。根据鲸参谋平台的数据可知&#xff0c;7月京东平台投影仪的销量将近20万&#xff0c;同比增长约16%&#xff1b;销售额将近3.8亿&#xff0c;同比增长约4%。 ​*数据…

django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.

运行django测试用例报错django.core.exceptions.AppRegistryNotReady: Apps arent loaded yet. 解决&#xff1a;在测试文件上方加上 django.setup() django.setup()是Django框架中的一个函数。它用于在非Django环境下使用Django的各种功能、模型和设置。 在常规的Django应用…

Tequila Works x Incredibuild

关于 Tequila Works Tequila Works 是一家位于西班牙马德里的电子游戏开发商&#xff0c;由劳尔鲁比奥 (Raul Rubio) 和卢兹桑乔 (Luz Sancho) 于2009年创立。该公司著名的游戏产品包括《死亡曙光》(Deadlight)、《霜华》(Rime)、《联盟外传&#xff1a;努努之歌》(Song of Nu…

springboot项目打包优化,将所有第三方包单独打包至lib目录

在pom.xml中配置以下代码&#xff0c;随后使用mvnw clean package打包 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 主…

韶音的耳机怎么样,韶音骨传导耳机值得入手吗

韶音关于骨传导耳机的产品在质量方面还是有着不错的表现&#xff0c;其最具代表性的骨传导耳机就是韶音OpenRun Pro&#xff0c;在国产骨传导耳机中是具备了一定的知名度&#xff0c;有着自主研发的声学技术。 最突出的点就在于颜色上多样化&#xff0c;有着经典的黑色&#xf…

每天一个工业通信协议(3)2023.8.29 (DAP接口)

文章目录 参考文献1.DAP接口介绍2.DAP接口的2/3pin3.一种DAP接口方案应用的说明,通过两步初始化把JTAG接口变成DAP接口使用4.DAP接口的协议4.1 DAP电报的分类(只用JTAG类电报)4.2 电报格式4.3 DAP有限状态机参考文献 李婧. DAP模块验证组件系统级开发和实现[D]. 陕西:西安电…

【详解配置文件系列】es7配置文件详解

首发博客地址 系列文章地址 配置文件 # ---------------------------------- Cluster -----------------------------------cluster.name: my-cluster# 集群的名称node.name: node-1# 节点的名称node.master: true# 是否允许节点成为主节点&#xff08;默认为 true&#xff09;…

springboot kafka消息消费学习 @KafkaListener 使用

kafka 配置类 用途&#xff1a;定义使用的基本 kafka 配置&#xff0c;以及定义Bean 下面文件是读取本地 spring 的标准配置文件的类&#xff0c;用于一般属性获取等操作 import lombok.Data; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.k…

第十八章、【Linux】认识与分析登录文件

18.1 什么是登录文件 什么是登录文件&#xff1f;简单地说&#xff0c;就是记录系统活动信息的几个文件&#xff0c;例如&#xff1a;何时何地何人&#xff0c;做了什么工作。换句话说就是&#xff1a;记录系统在什么时候由哪个程序做了什么样的行为时&#xff0c;发生了什么事…

前端食堂技术周刊第 97 期:Astro 3.0、8 月登陆 Web 平台的新功能、前端技术方案文档、理想的视口并不存在

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;栀子椰椰 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

个人炒伦敦银方法大公开

个人炒伦敦银的方法与机构投资者炒这个品种的方法是有不同的&#xff0c;但是双方可能会借鉴一些相同的分析工具&#xff0c;比方说有的机构可能也会使用技术分析&#xff0c;当然&#xff0c;个人投资者对技术分析这个词更是不会陌生。今天我们就从个人投资者的角度出发&#…

LeetCode(力扣)669. 修剪二叉搜索树Python

LeetCode669. 修剪二叉搜索树 题目链接代码 题目链接 https://leetcode.cn/problems/trim-a-binary-search-tree/ 代码 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # …

如何在IPhone 14、14 Pro和14 Pro Max上添加屏幕锁定

当你第一次获得iPhone时&#xff0c;系统会提示你为它创建一个密码&#xff0c;这样只有你才能访问它。你应该使用一个必须输入的密码&#xff0c;以便在iPhone 14被唤醒或打开时解锁它。这将提供更高级别的保护。当你打开数据保护时&#xff0c;iPhone上的数据会被加密&#x…

StringBuilder和SpringBuffer的区别

StringBuilder和SpringBuffer的区别 StringBuilder ​ StringBuilder不是线程安全的&#xff0c;这就意味着多个线程对StringBuilder进行访问的时候&#xff0c;可能造成数据不一致或异常。因为它适用于单线程的情况&#xff0c;如果我们确保使用环境在单线程的情况可以使用S…

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 目录 Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 一、简单介绍 二、OKHttp 4.xx 的 SDK 封装 aar 给 Unity 的使用注意 三、附录 OKHttp 的…

Linux gdb单步调试的原理

文章目录 一、demo演示二、原理分析参考资料 一、demo演示 .section .data message:.string "Hello, World!\n" len . - message.section .text .globl _start _start:# 调用 write() 函数输出 "Hello, World!"mov $1, %rax # 系统调用号为 1…

explain 参数解析

12个返回参数&#xff0c;分5、4、3理解记忆 5个 查询相关 id每个select 对应一个id&#xff0c;id越大越优先执行&#xff0c;优先级越高select_type查询类型&#xff0c;有11种table当前select对应的表名partitions匹配的表分区type对当前表的关联或者说匹配类型&#xff0…

leetcode70爬楼梯

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. …