【Linux网络】select函数

devtools/2024/11/15 8:40:19/

欢迎来到 破晓的历程的 博客

⛺️不负时光,不负己✈️

文章目录

    • select函数介绍
    • select函数参数介绍
    • select函数返回值
    • select的工作流程
    • TCP服务器【多路复用版】

select函数介绍

在Linux网络编程中,select 函数是一种非常有用的IO多路复用技术,它允许程序监视多个文件描述符(file descriptors),以等待一个或多个文件描述符变得“就绪”(ready),比如有数据可读、写操作可能不阻塞或者出现了异常条件。这对于提高网络服务器等需要同时处理多个网络连接的应用程序的效率至关重要。

#include <sys/select.h>  
#include <sys/time.h>  
#include <unistd.h>  int select(int nfds, fd_set *readfds, fd_set *writefds,  fd_set *exceptfds, struct timeval *timeout);

select()函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状态,可以用于某类IO操作了,包括可读,可写,发生异常三种

select函数参数介绍

nfds

select函数一次会等待多个文件描述符,nfds通常为设置的最大文件描述符+1

fd_set
readfds和writefds,exceptfds的类型都是fd_set,那么fd_set类型是什么呢?
fd_set本质是一个位图结构!比特位的位置代表对应的文件描述符,比特位的数值表示对应的文件描述符是否需要关心:1表示该位置的文件描述符需要关心,0表示该位置的文件描述符不需要关心。
为了方便对该结构进行相关的操作,操作系统也给我们准备了相关的函数:

       void FD_CLR(int fd, fd_set *set);//将某个文件描述符从位图中取消int  FD_ISSET(int fd, fd_set *set);//判断某个文件描述符在位图中是否被设置void FD_SET(int fd, fd_set *set);//将某个文件描述符设置进位图中void FD_ZERO(fd_set *set);//清空位图

readfds
这个参数为输入输出型参数,表示等待读事件的文件描述符集合。如果不需要关心有哪些文件描述符已经就绪,则可将该参数设置为nullptr
该参数为输入输出型参数:

  • 输入:我们将想要关心的文件描述符通过参数的形式传给内核函数。
  • 输出:等到函数醒来后,函数会将就绪的文件描述符设置进位图中,然后返回给上层

在这里插入图片描述

notice:第三个参数和第四个参数和第二个参数都是一样的,只不过第三个参数表示写就绪,第四个参数表示检查异常条件

timeout
该参数的类型为该结构体

struct timeval{__time_t tv_sec;		/* Seconds.  */__suseconds_t tv_usec;	/* Microseconds.  */};

在这里插入图片描述

select函数返回值

  • 成功时,select返回就绪的文件描述符的总数.
  • 如果在超时前没有任何文件描述符就绪,则返回0.
  • 出错时,返回-1,并设置errno以指示错误.

select的工作流程

应用进程和内核都需要从readfds和writefds获取信息,其中,内核需要从readfds和writefds知道哪些文件描述符需要等待,应用进程需要从readfds和writefds中知道哪些文件描述符的事件就绪.
在这里插入图片描述
如果我们要不断轮询等待文件描述符,则应用进程需要不断的重新设置readfds和writefds,因为每一次调用select,内核会修改readfds和writefds,所以我们需要在 应用程序 中 设置一个数组 来保存程序需要等待的文件描述符,保证调用 select 的时候readfds 和 writefds中的将如下:
在这里插入图片描述

TCP服务器【多路复用版】

如果是一个select服务器进程,则服务器进程会不断的接收有新链接,每个链接对应一个文件描述符,如果想要我们的服务器能够同时等待多个链接的数据的到来,我们监听套接字listen_sock读取新链接的时候,我们需要将新链接的文件描述符保存到read_arrys数组中,下次轮询检测的就会将新链接的文件描述符设置进readfds中,如果有链接关闭,则将相对应的文件描述符从read_arrys数组中拿走。

在这里插入图片描述


http://www.ppmy.cn/devtools/97339.html

相关文章

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a; 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; →点击获取网络安全资料攻略← 一、自学…

函数递归那些事

什么是递归 递归就是函数自己调用自己&#xff0c;而递归的本质其实是一种解决问题的方法。 递归的思想 递归的思想是把复杂问题大事化小的过程。即把一个大型复杂的问题不断的拆分成与原问题相似&#xff0c;但规模较小的子问题&#xff0c;直到子问题不能被拆分&#xff0…

[Linux][OS][信号的保存和处理]

目录 信号的处理 1. 在内核中的表示 2. 相关概念 3. 信号集操作函数 4.sigprocmask 5.sigpending 信号的捕捉 重谈地址空间 信号的处理 1. 在内核中的表示 普通信号&#xff0c;多次产生只会记录一次 信号范围 [1,31]&#xff0c;每一种信号都要有自己的一种处理方式…

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面(一)

学完时间&#xff1a;2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课&#xff0c;人数又成功的降了500名左右&#xff0c;到了3575人了。 二、ArkWeb 1、概念介绍 ArkWeb是用于应用程序中显示Web页面内容的Web组件&#xff0c;为开发者提供页面加载、页面交互、页面调…

Leetcode面试经典150题-155.最小栈

解法都在代码里&#xff0c;不懂就留言或者私信 我写了两种解法&#xff0c;建议选择双栈的&#xff0c;感觉这才是考察点 /**一般解法&#xff1a;过个笔试没问题&#xff0c;建议用双栈的方法 */ class MinStack2 {/**至少应该有一个栈用于保存数据 对于push和pop以及top的话…

在线学习考试设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

MySQL 安装与配置指南

MySQL 是一种广泛使用的关系型数据库管理系统&#xff0c;为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL&#xff0c;以及如何进行基本的配置&#xff0c;以确保数据库系统的最佳性能和稳定性。 一、环境准备 1.1 系统要求 …

代码随想录算法训练营第四十六天 | 动态规划 part13

647. 回文子串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1; i > 0; i--) {for (int j i; j < s.size(); j) {if (s[i] s…