Linux--I/O复用之select

news2024/12/24 2:16:40

目录

一:概念

二:使用

三:参数介绍:

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.coloradmin.cn/o/972866.html

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

相关文章

1.2 互联网概述

思维导图&#xff1a; 主要内容 &#xff1a; 这段话描述了“互联网”的基本概念和组成。首先&#xff0c;强调了该段文本主要是关于计算机网络的讨论&#xff0c;而不是关于电信网络或有线电视网络。 接下来&#xff0c;描述了计算机网络的基本构成&#xff0c;由结点&…

23062网络编程day8

将dict.txt导入到数据库中&#xff08;单词一列&#xff0c;意思一列&#xff09; #include <myhead.h> int main(int argc, const char *argv[]) {//打开数据库sqlite3 *db;if(sqlite3_open("./dict.db",&db) ! SQLITE_OK){fprintf(stderr,"sqlite3…

零代码编程:用ChatGPT批量整理excel表格数据

有这样一个表格&#xff0c;里面内容从pdf复制而来&#xff0c;只想保留专精特新示范企业名单&#xff0c;删除其他无关内容。 可以在ChatGPT中输入如下提示词&#xff1a; 你是一个Python编程专家&#xff0c;写一段代码&#xff0c;实现批量删除excel表格中特定单元格内容的…

【Element】Vue+Element表单校验详解

Element表单校验 作为一个后端开发&#xff0c;总结一下实际工作中表单校验的场景和用法。 Element官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/form 代码地址&#xff1a;https://gitee.com/kkmy/kw-microservices/tree/master/kw-ui/kwsphere 常用表单校验场…

小程序中如何查看会员的余额和变更记录

​通过查看会员的余额和变更记录&#xff0c;可以帮助商家更好地管理会员资金&#xff0c;提供更好的服务和用户体验。下面将介绍小程序中如何查看会员的余额以及余额的变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看余额和记录的会员…

【系统设计系列】 回顾可扩展性

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…

猫头虎博主赠书二期:《Go黑帽子 渗透测试编程之道(安全技术经典译丛) 》

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

volatile+SIGCHLD信号+可重入函数(了解)

索引 volatile1.gcc -O含义及其作用2.证明其内存可见性 深入理解SIGCHLD信号SIGCHLD总结 可重入函数 volatile 保存内存的可见性&#xff0c;告知编译器&#xff0c;该关键字修饰的变量不允许被优化&#xff0c;对该变量的任何操作都必须在内存中操作。 1.gcc -O含义及其作用…

JVM垃圾回收机制和常用算法(简洁版)

垃圾收集 (Garbage Collection,GC) 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的&#xff0c;只存在于线程的生命周期内&#xff0c;线程结束之后就会消失&#xff0c;因此不需要对这三个区域进行垃圾回收。 判断一个对象是…

QTday5作业

Tcp服务器 源文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); //此时就创建了一个服务器}Widg…

Android数据结构和算法总结-字符串相关高频面试题算法

前言 周末闲来无事&#xff0c;在七月在线上看了看字符串相关算法的讲解视频&#xff0c;收货颇丰&#xff0c;跟着视频讲解简单做了一下笔记&#xff0c;方便以后翻阅复习同时也很乐意分享给大家。什么字符串在算法中有多重要之类的大路边上的客套话就不多说了&#xff0c;直…

linux删除了业务进程正在使用的文件,又不能停止进程,如何释放文件占用的磁盘空间

一台linux分区使用率告警&#xff0c;同事为了清理空间&#xff0c;通过du -sh *查到应用的日志文件占用很高&#xff0c;他直接rm删除了日志文件。但df -h看分区空间并没有释放。 执行lsof | grep delete可以看到刚刚删除的文件因为被正在运行的进程调用所以并没有释放磁盘空间…

优维产品最佳实践:如何设计流水线?

前言&#xff1a;我们上期介绍了什么是CI以及CI的重要性&#xff0c;本期目标就是学习如何设计流水线&#xff0c;流水线是一种用于自动化软件开发和部署的工具链&#xff0c;它可以将软件开发过程中的各个步骤组织成一个连续的流程&#xff0c;从而提高开发效率和软件质量。在…

安装虚拟机+安装/删除镜像

安装虚拟机 注意&#xff0c;官网可能无法登录&#xff0c;导致无法从官网下载&#xff0c;就自己去网上搜靠谱的下载&#xff0c;我用的16.2.3 删除镜像 Vm虚拟机怎么删除已经创建的系统&#xff1f;Vm虚拟机创建好之后iso删除方法 - 系统之家 (xitongzhijia.net) 安装镜像…

Python中内建模块和标准库的工作原理? - 易智编译EaseEditing

Python中的内建模块和标准库是Python编程语言的一部分&#xff0c;它们提供了大量的功能和工具&#xff0c;可用于各种任务和应用程序。这些模块和库通常是由Python官方维护的&#xff0c;因此在任何标准Python安装中都是可用的。 以下是内建模块和标准库的工作原理的概述&…

数据结构——单调队列

单调队列 单调队列的概念和操作过程 概念&#xff1a; 单调队列和单调栈在操作上有相似之处&#xff0c;但因为单调队列是队列&#xff0c;所以多了一项特殊操作&#xff0c;即头部的元素可以出队&#xff0c;相当于滑动窗口向后滑动。这头部的出队操作就相当于淘汰&#xff0c…

需求管理做不好,项目成功难保障

你是否曾感觉客户的要求总是突然冒出来&#xff1f;或是觉得自己跟不上订单的节奏&#xff1f;不了解产品的需求会让你手忙脚乱&#xff0c;如果没有足够的资源来应对&#xff0c;甚至会损害你的业务。 本文将向你介绍需求管理的流程&#xff0c;以及如何在业务中使用它。 项目…

【洛谷算法题】P5703-苹果采购【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5703-苹果采购【入门1顺序结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

BCSP-玄子Share-Java框基础_反射

一、反射 1.1 反射介绍 Java反射&#xff1a;在编译时不确定哪个类被加载&#xff0c;而在程序运行时才加载、探知、使用 1.1.1 Java 程序的运行过程 1.1.2 反射及其作用 反射是指能够在运行时&#xff0c;观察并修改自己运行时(Runtime)行为的特性 Java 反射机制主要提供了…

verilog语法之case casez casex

在rtl仿真中&#xff0c;有四种状态&#xff0c;分别是0、1、x&#xff08;unknown values&#xff09;和z&#xff08;high-impedance values&#xff09;。 case 结构体中&#xff1a;0&#xff0c;1&#xff0c;X与Z是四种不同的状态&#xff0c;case条件比较时会检测比较双…