Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 为什么函数socket或accept的返回值可以用作redis中数组的下标_Sockets_Redis - Fatal编程技术网

Sockets 为什么函数socket或accept的返回值可以用作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

我阅读了以下redis源代码:

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实例可以预期的最大连接数。