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

Linuxselect使用陷阱

Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。...Select采用一个bit表,每个fd对应表中的一个bit位,宏FD_SETSIZE为表的大小,添加到fd_set中的fd值必须小于FD_SETSIZE,否则就会越界,假设有如下一段代码: fd_set...较容易发生在服务端程序中,因为服务端程序同一时刻的连接数很容易超过默认的FD_SETSIZE值,而服务端的代码可能是使用epoll使用的,所以它本身并不会存在问题,但是程序中可能还有个客户端,比如使用了...select来实现超时连接,这个时候问题就来了,当连接数超过FD_SETSIZE时,超时连接处的select调用就发生了越界,进程就会在某个可能完全不相干的地方crash,要定位这个问题的成本是很高的,...那就是尽量不使用select,而应当使用更安全的poll函数来替代,因为poll使用的数组是调用者自己维护的,完全可以保证不越界。

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

    linux select函数详解

    http://blog.csdn.net/lingfengtengfei/article/details/12392449 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select...对于 fd_set类型的变量我们所能做的就是声明一个变量,为变量赋一个同种类型变量的值,或者使用以下几个宏来控制它: #include     int FD_ZERO(int...fd_set *fd_set);    int FD_ISSET(int fd, fd_set *fdset);     FD_ZERO宏将一个 fd_set类型变量的所有位都设为 0,使用...清除某个位时可以使用 FD_CLR,我们可以使用FD_SET来测试某个位是否被置位。 当声明了一个文件描述符集后,必须用FD_ZERO将所有位置零。...(2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,一是用于再select返回后,array作为源数据和fd_set进行FD_ISSET判断。

    5.2K20

    Linux网络】select函数

    select函数介绍 在Linux网络编程中,select 函数是一种非常有用的IO多路复用技术,它允许程序监视多个文件描述符(file descriptors),以等待一个或多个文件描述符变得“就绪”...#include #include #include int select(int nfds, fd_set...所谓的”准备好“状态是指:文件描述符不再是阻塞状态,可以用于某类IO操作了,包括可读,可写,发生异常三种 select函数参数介绍 nfds select函数一次会等待多个文件描述符,nfds通常为设置的最大文件描述符...函数返回值 成功时,select返回就绪的文件描述符的总数....来保存程序需要等待的文件描述符,保证调用 select 的时候readfds 和 writefds中的将如下: TCP服务器【多路复用版】 如果是一个select服务器进程,则服务器进程会不断的接收有新链接

    20010

    Linux】从零开始使用多路转接IO --- select

    --- 中岛敦 《山月记》--- 1 前言 上一篇文章我们讲解了五种IO模型的基本概念,并通过系统调用使用了非阻塞IO。...一般的服务器不会使用非阻塞IO,因为非阻塞IO非常耗费CPU资源,导致CPU发热效率下降!非阻塞IO只有在特定情况下才比较好用! 今天我们来学习多路转接select。 我们知道IO = 等 + 拷贝。...来看select系统调用: SELECT(2) Linux Programmer's...OK,现在我们了解了select的基本参数,下面我们就开始使用select进行编程 3 多路转接select等待连接 我们首先把之前的套接字基础的类拷贝过来: class Socket:实现套接字的创建工作...5 总结 根据上面的代码,我们可以总结出select的一些优缺点: 每次调用 select,都需要手动设置 fd 集合, 从接口使用角度来说也非常不便.

    8310

    Linuxselect调用引发的血案

    Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。...Select采用一个bit表,每个fd对应表中的一个bit位,宏FD_SETSIZE为表的大小,添加到fd_set中的fd值必须小于FD_SETSIZE,否则就会越界,假设有如下一段代码: fd_set...较容易发生在服务端程序中,因为服务端程序同一时刻的连接数很容易超过默认的FD_SETSIZE值,而服务端的代码可能是使用epoll使用的,所以它本身并不会存在问题,但是程序中可能还有个客户端,比如使用了...select来实现超时连接,这个时候问题就来了,当连接数超过FD_SETSIZE时,超时连接处的select调用就发生了越界,进程就会在某个可能完全不相干的地方crash,要定位这个问题的成本是很高的,...那就是尽量不使用select,而应当使用更安全的poll函数来替代,因为poll使用的数组是调用者自己维护的,完全可以保证不越界。

    1.9K20

    linux 网络编程 IO复用 select,poll ,epoll

    核心思想:I/O复用 ---- 使用情景: 客户端程序要同时处理多个socket 客户端程序要同时处理用户输入和网络连接 TCP服务器要同时处理监听socket和连接socket,这是使用最多的场合...select失败时返回-1并设置errno 如果select 等待期间,程序接收到信号,则select立即返回-1,并设置errno为EINTR。...对写操作被关闭的socket执行写操作将出发一个SIGPIPE信号 socket使用非阻塞connect连接成功或者失败之后 socket上有未处理的错误,此时我们可以使用getsockopt来读取和清除该错误...可以使用epoll的EPOLLONESHOT事件实现一个socket连接在任一时刻都被一个线程处理。...---- 参考资料: 《Linux高性能服务器编程》

    2.6K20

    linux网络编程系列(十一)--select基本使用以及它和epoll区别

    1. select函数 复用IO还有一种就是select模型,我们下面就来简单介绍一下select用法。...1.1 select函数原型 int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval...()/close() 1.3 select使用 使用select也需先将socket设置为非阻塞的 下面演示如何使用select函数: struct timeval TimeOut, *pTimeOut...使用select如何检测连接已经关闭 如果连接断开了,select会返回1,但单纯的select返回1并不能说明连接断开了,也可能是有数据可读,所以此时需要再判断一下read或者recv的返回值,如果返回...,当然跟内存也有关,而select则在内核头文件中定义最多监视1024个文件描述符; epoll效率不会随着文件描述符数量的增长而直线下降; epoll使用mmap加速内核和用户空间的信息传递,避免多余的内存拷贝

    57620
    领券