【问题标题】:What does select do when nfds is greater than length of bit array in fd_set? Is it possible?当 nfds 大于 fd_set 中位数组的长度时,select 会做什么?可能吗?
【发布时间】:2018-11-28 07:16:57
【问题描述】:
int select(int nfds, 
       fd_set *readfds, 
       fd_set *writefds, 
       fd_set *exceptfds, 
       struct timeval *timeout);

假设 fd_set 的长度为 1024。如果我们要监控的fd是2048呢?发生这种情况时 select 会做什么?它会发生吗?

【问题讨论】:

标签: c linux unix select


【解决方案1】:

根据the specification,如果nfds大于FD_SETSIZEselect()将返回-1并将errno设置为EINVAL。

在某些实现中(包括在 Linux 系统上),它会改为写入 fd_set 结构之外的位,这可能会破坏应用程序中的内存。 (目的是允许应用程序使用更大的fd_set 结构,但其效果往往是导致应用程序在尝试使用超过 1024 个文件描述符时立即崩溃。)

要使用超过 1024 个文件描述符,您需要使用 select() 以外的 API。这些 API 通常是特定于系统的;要考虑的一个独立于平台的选项是libev 库,它为高度并发的应用程序提供了一组有用的抽象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多