【发布时间】: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 会做什么?它会发生吗?
【问题讨论】:
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 库,它为高度并发的应用程序提供了一组有用的抽象。
【讨论】: