增加FD_SETSIZE的限制并select

我想为我的系统增加FD_SETSIZEmacros值。 有什么办法可以增加FD_SETSIZE,所以select不会失败

Solutions Collecting From Web of "增加FD_SETSIZE的限制并select"

按照标准,没有办法增加FD_SETSIZE 。 一些程序和库(libevent想起来)试图通过为fd_set对象分配额外的空间并将大于FD_SETSIZE值传递给FD_*宏来解决这个FD_* ,但这是一个非常糟糕的想法,因为强健的实现可能执行边界检查如果它超出范围,就会失败。

我有一个替代解决方案应该始终工作(即使这不是标准所要求的)。 而不是一个单一的fd_set对象,分配一个足够大的数组来保存你需要的最大fd,然后使用FD_SET(fd%FD_SETSIZE, &fds_array[fd/FD_SETSIZE])等来访问该组。

如果可能,我也建议使用poll 。 还有一些像libevent或libev这样的“事件”处理库(或者GTK的Glib的事件能力,或者QtCore等等)应该可以帮助你。 还有像epoll这样的东西。 而你的问题与C10k有关

以民意调查取代会更好(也更容易)。 一般来说,poll()是select()方法的一个简单的替代方法,不受FD_SETSIZE 1024的限制。

 fd_set fd_read; int id = 42; FD_ZERO(fd_read); FD_SET(id, &fd_read); struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; if (select(id + 1, &fd_read, NULL, NULL, &tv) != 1) { // Error. } 

变为:

 struct pollfd pfd_read; int id = 42; int timeout = 5000; pfd_read.fd = id; pfd_read.events = POLLIN; if (poll(&pfd_read, 1, timeout) != 1) { // Error } 

您需要包含poll.h的pollfd结构。

如果您需要写入和读取,请将事件标志设置为POLLIN | POLLOUT。

在包含sys/select.h之前,可以增加FD_SETSIZE overiding __FD_SETSIZE(在sys/types.h定义)。

像这样继续,我们可以将FD_SETSIZE设置为2048

 #include <sys/types.h> #undef __FD_SETSIZE #define __FD_SETSIZE 2048 #include <sys/select.h> #include <stdio.h> int main() { printf("FD_SETSIZE:%d sizeof(fd_set):%d\n",FD_SETSIZE,sizeof(fd_set)); return 0; } 

将打印:

FD_SETSIZE:2048 sizeof(fd_set):128

但是,如果FD_SETSIZE跟随修改的值,sizeof(fd_set)应该是256(2048/8)而不是128(1024/8)。 这是因为包含sys/types.h已经用1024定义了fd_set。


为了使用更大的fd_set ,可以像这样定义一个扩展的:

 #include <sys/select.h> #include <stdio.h> #define EXT_FD_SETSIZE 2048 typedef struct { long __fds_bits[EXT_FD_SETSIZE / 8 / sizeof(long)]; } ext_fd_set; int main() { ext_fd_set fd; int s; printf("FD_SETSIZE:%d sizeof(fd):%ld\n", EXT_FD_SETSIZE, sizeof(fd)); FD_ZERO(&fd); while ( ((s=dup(0)) != -1) && (s < EXT_FD_SETSIZE) ) { FD_SET(s, &fd); } printf("select:%d\n", select(EXT_FD_SETSIZE,(fd_set*)&fd, NULL, NULL, NULL)); return 0; } 

这打印:

FD_SETSIZE:2048 sizeof(fd):256

选择:2045


为了打开超过1024个文件描述符,需要使用例如ulimit -n 2048来增加限制。

实际上有一种方法可以在Windows上增加FD_SETSIZE。 它在winsock.h和per microsoft中定义,你可以通过简单的定义来增加它,包括winsock.h

http://support.microsoft.com/kb/111855

我一直这样做,并没有问题的最大价值,我使用了一个服务器,我正在开发约5000