增加 FD_SETSIZE 的限制并选择
- 2024-10-30 08:35:00
- admin 原创
- 49
问题描述:
我想增加系统的 FD_SETSIZE 宏值。有没有办法增加 FD_SETSIZE 以便 select 不会失败
解决方案 1:
根据标准,没有办法增加FD_SETSIZE
。一些程序和库(想到了 libevent)试图通过为对象分配额外空间并将fd_set
大于的值传递FD_SETSIZE
给FD_*
宏来解决这个问题,但这是一个非常糟糕的主意,因为健壮的实现可能会对参数执行边界检查,如果超出范围则中止。
我有一个替代解决方案,它应该总是有效的(即使标准不要求这样做)。不要使用单个fd_set
对象,而是分配一个足够大的数组来容纳您需要的最大 fd,然后使用FD_SET(fd%FD_SETSIZE, &fds_array[fd/FD_SETSIZE])
等来访问该集合。
解决方案 2:
如果可能的话,我还建议使用poll
。并且存在几个“事件”处理库,如libevent或libev (或GTK 或QtCore等的Glib事件能力),它们应该会对您有所帮助。还有epoll之类的东西。您的问题与C10k有关
解决方案 3:
用 poll 替换会更好(也更容易)。通常 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
}
您需要为 pollfd 结构包含 poll.h。
如果您需要写入和读取,则将事件标志设置为 POLLIN | POLLOUT。
解决方案 4:
为了使用fd_set
大于 FD_SETSIZE 的值,可以定义一个扩展的值,如下:
#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
", EXT_FD_SETSIZE, sizeof(fd));
FD_ZERO(&fd);
while ( ((s=dup(0)) != -1) && (s < EXT_FD_SETSIZE) )
{
FD_SET(s, &fd);
}
printf("select:%d
", select(EXT_FD_SETSIZE,(fd_set*)&fd, NULL, NULL, NULL));
return 0;
}
这将打印:
FD_SETSIZE:2048 大小(fd):256
选择:2045
为了打开超过 1024 个文件描述符,需要使用例如来增加限制ulimit -n 2048
。
解决方案 5:
实际上,在 Windows 上有一种方法可以增加FD_SETSIZE
。它由winsock.h
Microsoft 定义,您只需在包含之前定义它即可增加它winsock.h
:
请参阅应用程序可使用的最大套接字数(旧链接),或最新页面支持的最大套接字数。
我一直这样做,没有遇到任何问题。我开发的服务器中使用的最大值约为 5000。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件