增加 FD_SETSIZE 的限制并选择

2024-10-30 08:35:00
admin
原创
218
摘要:问题描述:我想增加系统的 FD_SETSIZE 宏值。有没有办法增加 FD_SETSIZE 以便 select 不会失败解决方案 1:根据标准,没有办法增加FD_SETSIZE。一些程序和库(想到了 libevent)试图通过为对象分配额外空间并将fd_set大于的值传递FD_SETSIZE给FD_*宏来解决...

问题描述:

我想增加系统的 FD_SETSIZE 宏值。有没有办法增加 FD_SETSIZE 以便 select 不会失败


解决方案 1:

根据标准,没有办法增加FD_SETSIZE。一些程序和库(想到了 libevent)试图通过为对象分配额外空间并将fd_set大于的值传递FD_SETSIZEFD_*宏来解决这个问题,但这是一个非常糟糕的主意,因为健壮的实现可能会对参数执行边界检查,如果超出范围则中止。

我有一个替代解决方案,它应该总是有效的(即使标准不要求这样做)。不要使用单个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.hMicrosoft 定义,您只需在包含之前定义它即可增加它winsock.h

请参阅应用程序可使用的最大套接字数(旧链接),或最新页面支持的最大套接字数。

我一直这样做,没有遇到任何问题。我开发的服务器中使用的最大值约为 5000。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用