如果我有一个整数值大于 1024 的文件描述符,select() 仍然可以处理它吗?

问题描述 投票:0回答:1

select() 的手册页指出:警告:select() 只能监视小于 FD_SETSIZE (1024) 的文件描述符数量,这对于许多现代应用程序来说是一个不合理的下限。

这个很模糊,我理解select只能监控1024个文件描述符,但是如果我想让它监控单个文件描述符,一个整数值大于1024的描述符怎么办?

就上下文而言,我正在编写一个文件描述符超时为 15 秒的程序,并且该文件描述符可能具有大于 1024 的整数值。从我几个月前听到的情况来看,select() 似乎是一个素数此任务的选择。

我只会监视一个文件描述符,假设它被称为 int fd 且 fd == 65533。可以选择监视这个单个描述符 65533 吗?

c linux select unix-socket bsd
1个回答
0
投票

联机帮助页可能会给您这样的印象:1024 是

select
的硬性上限,但事实并非如此。一些 C 库允许您自己
#define FD_SETSIZE
,然后再包含
sys/select.h
,从而放大
fd_set
。即使您没有这些 C 库之一,也没有什么可以阻止您定义“自己的”、更大的类似 fd_set 的数据类型。内核不知道 C 库定义的 fd_set 有多大:相反,它信任
nfds
参数来告诉它有多少位。
但是,如果你只有一个 fd 需要监控,那么你绝对应该使用 poll() 而不是 select(),因为对于少量的 fd 来说,它使用起来更简单,而且效率更高。如果你有很多 fd 需要监控,epoll 或 kqueue 或类似的方法将比 poll 或 select 更有效。因此通常不值得费心去解决 fd_set 的大小。

© www.soinside.com 2019 - 2024. All rights reserved.