Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
C 什么';64位Linux上的文件描述符的范围是多少?_C_Linux - Fatal编程技术网

C 什么';64位Linux上的文件描述符的范围是多少?

C 什么';64位Linux上的文件描述符的范围是多少?,c,linux,C,Linux,我正在编写一个程序,在64位Linux上使用epoll_wait来等待文件描述符,并尝试将一些信息与文件描述符一起放入epoll_事件用户数据中 我知道在实践中,文件描述符不太可能超过32位。只是想知道内核保证文件描述符有一个特定的范围,或者它只是从小开始计数,不太可能变大?您是否计划打开20亿个文件描述符,您是否希望操作系统能够处理这个问题 在大多数*NIX中,返回FD的函数将其作为int返回,其中

我正在编写一个程序,在64位Linux上使用epoll_wait来等待文件描述符,并尝试将一些信息与文件描述符一起放入epoll_事件用户数据中


我知道在实践中,文件描述符不太可能超过32位。只是想知道内核保证文件描述符有一个特定的范围,或者它只是从小开始计数,不太可能变大?

您是否计划打开20亿个文件描述符,您是否希望操作系统能够处理这个问题

在大多数*NIX中,返回FD的函数将其作为
int
返回,其中<0是无效的描述符。这些函数以
int
返回FD,因此类型的范围就是FD的范围。(减去否定词(不是双关语))我也会这样做:使用相同的类型,因此,
int
添加新文件描述符的
epoll_ctl(2)
接口使用了一个
intfd
参数,因此您已经被限制在32位范围内(至少在我熟悉的Linux平台上)

您还受到
/proc/sys/fs/file max
系统范围内所有进程打开文件数量的限制
/proc/sys/fs/file max
当前在我的系统上
595956

每个进程通过
setrlimit(2)
RLIMIT_NOFILE
每个进程对打开文件数量的限制进一步进行限制。1024是一个常见的
RLIMIT\u NOFILE
限制。(很容易通过
/etc/security/limits.conf
更改此限制)


这是一个罕见的应用程序,需要超过1024个。完整的32位似乎也不太可能,因为每个打开的文件都需要一些内核内存来表示——40亿~280字节的
结构inode
结构(至少)是大量的固定内存。

我在内核中找到一条注释,指出硬上限为1024*1024。

64位上的文件描述符范围(也适用于32位系统)Linux为0到1023,您不能创建超过1023个打开的文件描述符。如果尝试打开超过1023个的文件描述符,系统将返回错误EBADF(错误的文件描述符),错误号-9。

我可以想象FD数字是循环使用的——例如,永远不要超过进程中并发开放描述符的最高数量——但是……我不知道。FD定义为“小”非负整数,不管“小”是什么意味着在运行时。除此之外,内核不保证它的价值。谢谢,看来我可以安全地腾出一点时间来使用。