c - 当nfds大于fd_set中的位数组长度时,select会做什么?是否可以?

标签 c linux unix select

int select(int nfds, 
       fd_set *readfds, 
       fd_set *writefds, 
       fd_set *exceptfds, 
       struct timeval *timeout);

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

最佳答案

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

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

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

关于c - 当nfds大于fd_set中的位数组长度时,select会做什么?是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53514051/

相关文章:

linux - 使用 cat 命令以新行开始每个文件

c - 两个信号量不通信

c - 在 C 中的列表末尾添加新结构

linux - 我如何在 bash "tee"中 "for loop"可变次数?

linux - 用逗号和空格替换换行符以生成 1 行输出

unix - 将 gzip 的输出通过管道传输到 csplit

c - 什么是一组整数集的简单 C 库?

c - 为什么在 C 中使用以下宏函数会导致 1 而不是 2?

linux - EPOLL 和传入流的饥饿

c - 如何创建 UNIX/Linux 命令?