Sockets 为什么函数socket或accept的返回值可以用作redis中数组的下标
我阅读了以下redis源代码:Sockets 为什么函数socket或accept的返回值可以用作redis中数组的下标,sockets,redis,Sockets,Redis,我阅读了以下redis源代码: int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, aeFileProc *proc, void *clientData) { if (fd >= eventLoop->setsize) { errno = ERANGE; return AE_ERR; } aeFileEvent *fe = &ev
int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
aeFileProc *proc, void *clientData)
{
if (fd >= eventLoop->setsize) {
errno = ERANGE;
return AE_ERR;
}
aeFileEvent *fe = &eventLoop->events[fd];
//...
}
“fd”参数是函数socket或accept的返回值,并用作数组“eventLoop->events”的下标。“eventLoop->setsize”被初始化为10000+1024=11024
所以我的问题是:函数socket或accept的返回值的范围是多少?为什么它们可以用作数组的下标
函数socket或accept的返回值的范围是多少
在Unix/Linux中,文件描述符fd
或套接字描述符是“小整数”
为什么它们可以用作数组的下标
因为它们是小整数。根据POSIX,文件描述符是: 每个进程唯一的非负整数,用于标识打开的文件以进行文件访问。新创建的文件描述符的值从零到{open_MAX}-1。如果{open_MAX}的值减少,则文件描述符的值可以大于或等于{open_MAX}(请参阅sysconf)由于文件描述符已打开。文件描述符也可用于实现消息目录描述符和目录流。“ 现在,在实践中,每个Unix/Linux进程都有一个驻留在内核中的文件描述符表,其索引正是文件描述符。其结果是文件描述符不能是非常大的整数,因为操作系统将尽力避免增加文件描述符表的上限。因此,在用户空间应用程序(如Redis)中使用文件描述符索引数组是安全的 此外,POSIX标准保证在必须提供新的文件描述符时,系统地选择编号最低的未使用文件描述符。例如,请参见返回值的POSIX规范
结果是进程的最高文件描述符(即文件描述符表的最高界限)总是低于或等于进程使用的文件描述符的峰值数。在redis中,“eventLoop->setsize”值初始化为redis_MAX_CLIENTS+1024,其中redis_MAX_CLIENTS是一个等于10000的宏,“eventLoop->setsize”可以通过用户配置进行更改。正如您所解释的,我认为最好、最安全的方法是使用OPEN_MAX扩展名定义数组,而不是另一个宏。顺便说一句,OPEN_MAX已被弃用。不,请不要使用OPEN_MAX或任何其他宏。只需将此值设置为您的Redis实例可以预期的最大连接数。