Viv*_*oel 17 c linux file-descriptor
我想为我的系统增加FD_SETSIZE宏值.有没有办法增加FD_SETSIZE所以选择不会失败
R..*_*R.. 14
按照标准,没有办法增加FD_SETSIZE.一些程序和库(libevent脑海中浮现)尝试通过为fd_set对象分配额外的空间并传递大于宏的值FD_SETSIZE来解决这个问题FD_*,但这是一个非常糟糕的主意,因为健壮的实现可能会对参数执行边界检查,如果它超出范围则中止.
我有一个应该始终有效的替代解决方案(即使标准不要求它).而不是单个fd_set对象,分配一个足够大的数组来保存您需要的最大fd,然后使用FD_SET(fd%FD_SETSIZE, &fds_array[fd/FD_SETSIZE])等来访问该集合.
用民意调查取代会更好(也更容易).通常poll()是select()的简单替代品,不受1024的FD_SETSIZE限制......
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.
}
Run Code Online (Sandbox Code Playgroud)
变为:
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
}
Run Code Online (Sandbox Code Playgroud)
您需要为pollfd结构包含poll.h.
如果你需要写和读,那么将事件标志设置为POLLIN | POLLOUT.
为了使用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\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;
}
Run Code Online (Sandbox Code Playgroud)
这打印:
FD_SETSIZE:2048 sizeof(fd):256
选择:2045
ulimit -n 2048.