crash bug之 select

crash bug之 select


在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数
 一般定义为 1024个, 定义在/usr/include/sys/select.h或<bits/types.h>中
你会发现sizeof(fd_set)的结果是128(*8 = FD_SETSIZE=1024).
 
Select用到了fd_set结构,从man page里可以知道fd_set能容纳的句柄和FD_SETSIZE相
关。实际上fd_set在*nix下是一个bit标志数组,每个bit表示对应下标的fd是不是在
fd_set中。fd_set只能容纳编号小于 FD_SETSIZE的那些句柄

FD_SETSIZE默认是1024,如果向fd_set里放入过大的句柄,宏FD_SET会引起fd_set数组越界以后程序就会垮
掉。
系统默认限制了一个进程最大的句柄号不超过1024,但是可以通过ulimit -n命令
/setrlimit函数来扩大这一限制。如果不幸一个程序在FD_SETSIZE=1024的环境下编
译,运行时又遇到ulimit –n > 1024的,那就只有祈求上帝保佑不会垮掉了。

 

过大的句柄导致crash的解决方案有2种:

1)在程序的一个头文件中重新定义__FD_SETSIZE为一个大值(如32768), 并且保证这个头文件被每个cpp或头文件第一个包含.

如:
#include <bits/types.h>
#ifdef __FD_SETSIZE
 #undef __FD_SETSIZE
#endif

#define __FD_SETSIZE    32768

2)采用poll或其他IO模型来代替select.


Ref:

FD_SETSIZE在不同操作系统中的行为(From Squid): http://blog.vckbase.com/bastet/archive/2006/07/26/21533.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值