crash bug之 select

来源:互联网 发布:python迭代器 编辑:程序博客网 时间:2024/06/10 04:27

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

原创粉丝点击