当nfds大于fd_set中的位数组长度时,select会做什么?可能吗?

时间:2018-11-28 07:16:57

标签: 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会做什么?会发生吗?

1 个答案:

答案 0 :(得分:2)

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

在某些实现中(包括Linux系统上),它将写入fd_set结构外部的位,从而可能破坏应用程序中的内存。 (其目的是允许应用程序使用较大的fd_set结构,但是这样做的结果通常是,一旦应用程序尝试使用超过1024个文件描述符,它们就会崩溃。)

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