当前位置: 首页 > news >正文

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.lryc.cn/news/161836.html

相关文章:

  • 数据结构大作业 成绩分析c语言程序设计
  • Consul学习笔记之-初识Consul
  • python实现读取并显示图片的两种方法
  • Spring Boot 整合 MyBatis
  • 2023高教社杯数学建模A题B题C题D题E题思路模型 国赛建模思路分享
  • 手机木马远程控制复现
  • linux 安装Docker
  • Java中的值传递与引用传递 含面试题
  • SQL中CONVERT()函数用法详解
  • 借助各大模型的优点生成原创视频(真人人声)Plus
  • 技能大赛物联网赛项参赛软件建设方案
  • 蓝桥杯官网练习题(凯撒加密)
  • JavaScript 数组中常用的方法
  • YOLOV7改进-添加基于注意力机制的目标检测头(DYHEAD)
  • 爬虫爬取mp3文件例子
  • 说说什么是间隙锁
  • python小题库(三)
  • 【前端设计模式】之单例模式
  • Linux——(第六章)常用指令(一)
  • 第19章_瑞萨MCU零基础入门系列教程之RTC
  • 6、Spring之依赖注入源码解析(上)
  • vscode各种配置的方法
  • 每天几道面试题(第一天)
  • [paddle]paddlepaddle官方安装命令合集
  • 使用JS实现一个简单的观察者模式(Observer)
  • 智能井盖传感器:高效守护城市道路安全
  • pycharm创建py文件时自动添加基础信息--模板
  • Notpad++常用正则表达式替换案例集锦
  • DGA行为转变引发了对网络安全的担忧
  • 微信小程序开发---页面导航