文件描述符的值可以超过最大打开文件描述符软限制吗?

Can value of a file descriptor go beyond max opened file descriptor softlimit?

在我的程序中,我使用文件描述符 value 作为索引将一些与文件描述符相关的数据存储在数组中。因此,如果我创建一个大小等于打开的文件描述符的软限制的数组,我的数组索引将从 0 -(软限制-1)开始。我的问题是文件描述符的值可以超出这个索引范围吗? (我用的是ubuntu 20.4和c语言)。

是的,可以。软限制是你可以通过调用 ulimit(2) 系统调用来改变的东西....所以你可以把它放在实际打开文件的数量下,这意味着 open(2) 将在下一次打开时失败, 但它不会影响您现在打开的实际打开文件数。无论如何......让我们想象一下这个场景:

  • 你打开了 97 个文件(加上 stdin、stdout 和 stderr,这使得 100 个打开的描述符从 0 到 99)
  • 您关闭了描述符 0 到 49(您仍然打开了 50 到 99)。 (请注意,此示例不允许您打印任何内容,因为您已关闭标准输入、标准输出和标准错误)
  • 您将软限制降低到 75。

你仍然可以再打开 25 个文件(你现在有 50 个打开的文件)...它们会在 0 到 24 的范围内,但其他的继续从 50 到 99 打开。你不能打开更多文件,因为您 运行 超出了打开文件的限制。

顺便说一句,您从系统调用中获取的描述符始终是要获取的可用数量的最小值...因此,如果您避免触及 ulimits 最大打开文件数,那么您可以随心所欲