为什么函数socket或accept的返回值可以用作redis中数组的下标

时间:2013-08-07 08:45:19

标签: 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 = &eventLoop->events[fd];
    //...
}

'fd'参数是函数socket或accept的返回值,并用作数组'eventLoop-> events'的下标。 'eventLoop-> setsize'初始化为10000 + 1024 = 11024。

所以我的问题是:函数socket或accept的返回值范围是多少?为什么它们可以用作数组的下标?

2 个答案:

答案 0 :(得分:1)

根据POSIX,文件描述符是:

“每个进程唯一的非负整数,用于标识用于文件访问的打开文件。新创建的文件描述符的值从零到{OPEN_MAX} -1。文件描述符可以由于文件描述符被打开,如果{OPEN_MAX}的值减少(参见sysconf),则值大于或等于{OPEN_MAX}。文件描述符也可用于实现消息目录描述符和目录流。“

现在,实际上,每个Unix / Linux进程都有一个内核驻留文件描述符表,其索引正是文件描述符。结果是文件描述符不能是非常大的整数,因为操作系统会尽力避免增加文件描述符表的最高界限。因此,在像Redis这样的用户空间应用程序中使用文件描述符索引数组是安全的。

此外,POSIX标准保证当必须提供新的文件描述符时,系统地选择编号最小的未使用文件描述符。例如,参见open call返回值的POSIX规范。

结果是进程的最高文件描述符(即文件描述符表的最高边界)始终低于或等于进程使用的文件描述符的峰值数。

答案 1 :(得分:0)

  

函数套接字的返回值范围是什么?接受?

在Unix / Linux中,文件描述符fd或套接字描述符是'小整数'。

  

为什么它们可以用作数组的下标?

因为它们是小整数。