int select(int nfds,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
给出fd_set的长度为1024。如果我们要监视的FD是2048怎么办?当发生这种情况时,select会做什么?会发生吗?
答案 0 :(得分:2)
根据the specification,如果nfds
大于FD_SETSIZE
,则select()
将返回-1并将errno
设置为EINVAL。
在某些实现中(包括Linux系统上),它将写入fd_set
结构外部的位,从而可能破坏应用程序中的内存。 (其目的是允许应用程序使用较大的fd_set
结构,但是这样做的结果通常是,一旦应用程序尝试使用超过1024个文件描述符,它们就会崩溃。)
要使用1024个以上的文件描述符,您将需要使用select()
以外的API。这些API通常是特定于系统的。 libev库是要考虑的与平台无关的一个选项,该库为高度并发的应用程序提供了一组有用的抽象。