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

标签 c linux select unix-socket bsd

select() 的手册页指出:

WARNING: select() can monitor only file descriptors numbers that are less than FD_SETSIZE (1024)—an unreasonably low limit for many modern applications.

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

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

我只会监视一个文件描述符,假设它名为 int fdfd == 65533。可以选择观看这个单一描述符65533吗?

最佳答案

联机帮助页可能会给您这样的印象:1024 是 select 的硬上限,但事实并非如此。某些 C 库允许您在包含 sys/select.h 之前自行#define FD_SETSIZE,从而扩大 fd_set。即使您没有这些 C 库之一,也没有什么可以阻止您定义您自己的、更大的类似 fd_set 的数据类型。内核不知道 C 库定义的 fd_set 有多大:相反,它信任 nfds 参数来告诉它有多少位。

但是,如果您只有一个 fd 要监视,那么您绝对应该使用 poll() 而不是 select(),因为它使用起来更简单,而且功能更多高效,对于少量的 fd。如果您有许多个fd要监视,epollkqueue或类似的将比poll选择。因此通常不值得费心解决 fd_set 的大小。

关于c - 如果我有一个整数值大于 1024 的文件描述符,select() 仍然可以处理它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77254417/

相关文章:

C - popen() 和 fread() 导致 accept() 抛出错误

c - 如何将无符号整数转换为 float ?

c++ - 在 debian 中安装 boost(用于 Codeblocks)

mysql - 连接来自不同脚本 MYSQL 的两个表

mysql - SQL 用条件区分列

C:数组输出

比较两个 uint8_t 类型变量的内容 A[8] = uint8_t B

linux - 如何动态定义子包

c++ - GCC C++11 无法查看 #if windows 和 #if linux(重新询问)

sql-server-2008 - 在同一个选择中使用别名