首页
学习
活动
专区
工具
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.1K20

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.5K20

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加速内核和用户空间的信息传递,避免多余的内存拷贝

49220

Postgresql使用Plpgsql编译SELECT INTO细节

select 列名1,列名2 into 变量1,变量2 这类调用形式的代码执行细节分析记录。 总结速查 lex在解析到into后,会进入函数把into后面的字符全部拿出来处理。...yacc在拿到T_DATUM后开始处理PLwdatum,拿到plpgsql_Datums数组中的变量,如果变量类型是row或record则可以直接使用,如果是var则需要拼接into后面所有字符 到一个...例如:SELECT userid, username INTO userid, username stmt_execsql : K_IMPORT {}...get_userid('a'); 编译细节 lex token解析过程,调试时使用gdb断plpgsql_yylex。...T_DATUM后会启动拼接流程,即把into后面的变量组装起来: 情况一:如果lex返回的wdatum.datum->dtype类型是PLPGSQL_DTYPE_ROW或PLPGSQL_DTYPE_REC,会直接使用

56810
领券