select() 的手册页指出:警告:select() 只能监视小于 FD_SETSIZE (1024) 的文件描述符数量,这对于许多现代应用程序来说是一个不合理的下限。
这个很模糊,我理解select只能监控1024个文件描述符,但是如果我想让它监控单个文件描述符,一个整数值大于1024的描述符怎么办?
就上下文而言,我正在编写一个文件描述符超时为 15 秒的程序,并且该文件描述符可能具有大于 1024 的整数值。从我几个月前听到的情况来看,select() 似乎是一个素数此任务的选择。
我只会监视一个文件描述符,假设它被称为 int fd 且 fd == 65533。可以选择监视这个单个描述符 65533 吗?
联机帮助页可能会给您这样的印象: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 的大小。