2

我在下面阅读了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的返回值范围是多少?为什么它们可以用作数组的下标?

4

2 回答 2

1

根据 POSIX,文件描述符是:

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

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

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

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

于 2013-08-07T11:37:02.830 回答
0

函数socket或accept的返回值范围是多少?

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

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

因为它们是小整数。

于 2013-08-07T10:15:08.517 回答