我在下面阅读了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的返回值范围是多少?为什么它们可以用作数组的下标?
答案 0 :(得分:1)
根据POSIX,文件描述符是:
“每个进程唯一的非负整数,用于标识用于文件访问的打开文件。新创建的文件描述符的值从零到{OPEN_MAX} -1。文件描述符可以由于文件描述符被打开,如果{OPEN_MAX}的值减少(参见sysconf),则值大于或等于{OPEN_MAX}。文件描述符也可用于实现消息目录描述符和目录流。“
现在,实际上,每个Unix / Linux进程都有一个内核驻留文件描述符表,其索引正是文件描述符。结果是文件描述符不能是非常大的整数,因为操作系统会尽力避免增加文件描述符表的最高界限。因此,在像Redis这样的用户空间应用程序中使用文件描述符索引数组是安全的。
此外,POSIX标准保证当必须提供新的文件描述符时,系统地选择编号最小的未使用文件描述符。例如,参见open call返回值的POSIX规范。
结果是进程的最高文件描述符(即文件描述符表的最高边界)始终低于或等于进程使用的文件描述符的峰值数。
答案 1 :(得分:0)
函数套接字的返回值范围是什么?接受?
在Unix / Linux中,文件描述符fd
或套接字描述符是'小整数'。
为什么它们可以用作数组的下标?
因为它们是小整数。