首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linuxfd_set 结构

fd_set是一种数据类型,在select函数中包含了3个参数,就是这个fd_set类型,fd_set也是理解select模型的关键,关于select的具体说明,可以参考之前的文章嵌入式Linux编程之...select可以同时对多个文件描述符的状态去监听,那么这个所谓的“多个”的实现就是通过fd_set来实现的, 简单的说: fd_set是select监听描述符的集合,每个描述符集存储在一个fd_set...上面的话,可能会有些让人迷糊,之所以迷糊的原因就是, 文件描述符可大可小,是随意的,可以使1、2、3等等,那这个具体的数,怎么只能有1位来实现呢,为了说明问题,我们先假定 fd_set 的长度只有1个字节...,也就是只有8bit,那么1个字节长的fd_set最大可以对应8个文件描述符(fd), 那么问题来了,如果文件描述符是100怎么办?...至于fd_set的最大为多少,取决于机器,一般 是够用的,因为linux在分配文件描述符的时候,不是随意分配 个几千几万的,这个是比较宝贵的资源,是从小到大,一点点递增的,谁也不会傻到同时打开几万个文件的

2.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux多路复用Select()与poll()函数

    解决问题 Linux健全的API已经为我们提供了解决问题的方法,在此我们引入select()函数、poll函数。...select()函数的接口主要是建立在一种叫'fd_set'类型的基础上。它('fd_set')是一组文件描述符(fd)的集合。...通常只能包含少于等于32个文件描述符,因为fd_set其实只用了一个int的比特矢量来实现,在大多数情况下,检查fd_set能包括任意值的文件描述符是系统的责任,但确定你的fd_set到底能放多少有时你应该检查...[Linux就是这样的系统!你会发现sizeof(fd_set)的结果是128(*8 =FD_SETSIZE=1024) 尽管很少你会遇到这种情况。]...[在Linux中,timeout指的是程序在非sleep状态中度过的时间,而不是实际上过去的时间,这就会引起和非Linux平台移植上的时间不等问题。

    2.7K40

    深入学习IO多路复用 selectpollepoll 实现原理

    Linux 服务器处理网络请求有三种机制,select、poll、epoll,本文打算深入学习下其实现原理。...中同步 IO 都会有的问题,因为 Linux 没有提供异步 IO 实现; Linux 的 IO 多路复用用三种实现:select、poll、epoll。...Linux 怎样处理网络请求 1.1 阻塞 IO 要讲 IO 多路复用,最好先把传统的同步阻塞的网络 IO 的交互方式剖析清楚。...fd_set 所有位置 0 int FD_CLR(int fd, fd_set *fdset);   // 将 fd_set 某一位置 0 int FD_SET(int fd, fd_set *fd_set...图解 Linux 网络包接收过程 图解 | 深入理解高性能网络开发路上的绊脚石 - 同步阻塞网络 IO 从 linux 源码看 socket 的阻塞和非阻塞 Select、Poll、Epoll 详解 你管这破玩意叫

    5.3K88

    c++ 网络编程(四)TCPIP LINUXwindows下 socket 基于IO复用的服务器端代码 解决多进程服务端创建进程资源浪费问题

    (1),struct fd_set 这是一个集合,这个集合中存放的是文件描述符(在unix、linux系统中任何的设备、管道、FIFO等都可通过文件描述符的形式来访问)。...相关的操作有: FD_ZERO(fd_set *)将某一个集合清空 FD_SET(int, fd_set *)将一个给定的文件描述符加入到集合之中 FD_CLR(int, fd_set *)从集合中删除指定的文件描述符...linux下监控键盘数据: #include #include #include #...) 指定监视范围,Linux上创建文件对象生成的对应文件描述符是从0开始递增的,所以最大监视范围为最后创建的文件描述符+1。...下面给出LINUX下基于I/O复用服务端实现代码: #include #include #include #include <unistd.h

    1.6K60

    Linux下基于TCP协议的群聊系统设计(多线程+select)

    一、功能介绍 这是基于Linux下命令行设计的一个简单的群聊天程序。...这个例子可以学习、巩固Linux下网络编程相关知识点 练习Linux下socket、TCP编程 练习Linux下pthread、线程编程 练习Linux下多路IO检测、select函数使用 练习C语言链表使用...Linux下监听文件描述符状态的函数有3个:select、poll、epoll,这3个函数都可以用在socket网络编程里监听客户端、服务器的状态。...*readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 函数功能: 监听指定数量的文件描述符的状态。...为真就表示产生了事件 void FD_SET(int fd, fd_set *set); //将指定的文件描述符添加到指定的集合 void FD_ZERO(fd_set *set); //清空整个集合

    1.2K30

    Linux select 一网打尽

    注:本文的所有内容均指针对 Linux Kernel, 当前使用的源码版本是 5.3.0 原型 int select (int __nfds, fd_set *__restrict __readfds,...中所包括的fd数值的最大值 + 1, linux task打开句柄从0开始,不加1的话可能会少监控fd....linux man中的解释如下: nfds should be set to the highest-numbered file descriptor in any of the three sets...计算内核空间所需要的fd_set的空间, 内核态需要三个fd_set来容纳用户态传递过来的参数,还需要三个fd_set来容纳select调用返回后生成的三灰fd_set, 即一共是6个fd_set...精华所在 do_select wait queue 这里用到了Linux里一个很重要的数据结构 wait queue, 我们暂不打算展开来讲,先简单来说下其用法,比如我们在进程中read时经常要等待数据准备好

    2.3K01

    单线程的Redis为什么辣么快?

    以上三种是在内核机制上对文件描述符(file descriptor)集合进行轮询的三种方式(过去是多线程,现在流行多文件描述符,Linux/Unix系统不是有句名言吗?...Select 这种方式就是有一个叫select的函数,如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds...理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。...epoll没那么通用,是Linux专有的,有的系统不支持。 Redis支持四种多路复用 好,上面简单介绍了select、poll、epoll。 现在我们来看看redis的内部的多路复用实现。 ?...而epoll是最强大的,可以动态添加删除socket,而且返回的fd_set是已经就绪了的fd,无须你再循环检查,但epoll是针对Linux的,部分操作系统不支持。

    42120

    IO多路复用的三种机制Select,Poll,Epoll

    Select 我们先分析一下select函数 int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const...fd_set *readset , fd_set *writeset , fd_set *exceptset fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor...select机制的问题 每次调用select,都需要把fd_set集合从用户态拷贝到内核态,如果fd_set集合很大时,那这个开销也很大 同时每次调用select都需要在内核遍历传递进来的所有fd_set...,如果fd_set集合很大时,那这个开销也很大 为了减少数据拷贝带来的性能损坏,内核对被监控的fd_set集合大小做了限制,并且这个是通过宏控制的,大小不可改变(限制为1024) Poll poll...poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

    1.1K20

    万字图解| 深入揭秘IO多路复用

    epoll边缘触发、水平触发的区别、适合场景 为什么在 Linux 网络编程中最好用非阻塞式 IO?...select select是Linux最早支持IO多路复用的函数。 select原理 通过select函数可以完成多个IO事件的监听。...fd, fd_set *set); // 将文件描述符fd添加到set集合中 void FD_SET(int fd, fd_set *set); // 将set集合中, 所有文件描述符对应的标志位设置为...0 void FD_ZERO(fd_set *set); select缺点 fd_set长度限制:由于fd_set本质是一个数组,同时操作系统限制了其长度,导致其只能接受文件描述符数值在1024以内的...由于fd_set本质是数组,所以每次内核都是线性扫描整个 fd_set,判断是否有IO就绪事件,导致随着监控的描述符 fd 数量增长,其性能会线性下降 poll poll是在select之后出现的另一种

    2.9K24

    『腾讯后台开发』实习生技能要求

    一、操作系统方面 多线程相关与线程之间同步技术 熟练使用(但不局限于)以下linux API linux下的线程创建、等待、获取线程id 1int pthread_create(pthread_t *thread...pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); 7int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); 8//这两个函数在Linux...熟悉守护进程的创建、原理 了解计划作业crontab 熟悉进程、线程状态查看命令(top、strace、pstack) 熟悉内存状态查看命令memstat、free 熟悉IO状态查看命令iostat、df、du 了解linux...*readfds, fd_set *writefds, 10 fd_set *exceptfds, struct timeval *timeout); 11void...FD_CLR(int fd, fd_set *set); 12int FD_ISSET(int fd, fd_set *set); 13void FD_SET(int fd, fd_set *set)

    86220

    IO多路复用模型

    三种IO复用方法 select 函数API int select (int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct...FD_ZERO(fd_set *fdset) 将指定的文件描述符集清空 FD_SET(fd_set *fdset) 用于在文件描述符集合中增加一个新的文件描述符。...epoll_data_t; //创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大 int epoll_create(int size); 参数: size以前是用来作fd数目参考,linux2.6.8...只有活跃的客户端才会调用回调函数,所以epoll会因为活跃的连接数过多而性能下降) Linux平台专用。 超时精度为毫秒。...三者原理 select poll epoll 总结 参考 五种IO模型 聊聊IO多路复用之select、poll、epoll详解 Linux IO模式及 select、poll、epoll详解 select

    43320

    多路复用_java多路复用

    fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); FD_ZERO(int fd, fd_set* fds) // 清空集合...FD_SET(int fd, fd_set* fds) // 将给定的描述符加入集合 FD_ISSET(int fd, fd_set* fds) // 判断指定描述符是否在集合中 FD_CLR...函数返回后,需要便利fd_set来找到就绪的描述符 参数说明: nfds: 需要监听的描述符的范围,一般是最大描述符+1,比如,现在需要监听 0/1/2/3/4/5 这几个描述符,则参数设置为6,在linux...*fdset); //清空一个描述符集合 FD_SET(fd_set *fdset, int fd); //添加fd到描述符集合中 FD_CLR(fd_set *fdset, int fd); //从描述符集合中删除一个...3.2、优缺点 监听数量不受限制,理论上上限是最大可以打开的文件数目,这个数目一般远大于2048,linux上可以使用 cat /proc/sys/fs/file-max 命令查看。

    61220
    领券