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_SETSIZE
,select()
将返回 -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/