根据 Robert Love 教科书的文件大小限制

Arp*_*ith 4 linux system-programming limit files

来自 Robert Love 的Linux System Programming (2007, O'Reilly),这是第一段(第 1 章,第 10 页)中给出的内容:

文件位置的最大值仅受用于存储它的 C 类型大小的限制,在当代 Linux 中为 64 位。

但在下一段中,他说:

文件可能为空(长度为零),因此不包含有效字节。与最大文件位置一样,最大文件长度仅受 Linux 内核用于管理文件的 C 类型大小的限制。

我知道这可能非常非常基本,但是他是说文件大小受FILE数据类型或int数据类型的限制吗?

gol*_*cks 5

他说它受 64 位类型的约束,该类型的最大值为 (2 ^ 64) - 1 无符号,或 (2 ^ 63) - 1 有符号(1 位保存符号,+/-)。

类型不是FILE; 它是实现用于跟踪文件中的偏移量的内容,即off_t,它是有符号64 位类型的 typedef 。1 (2 ^ 63) - 1 = 9223372036854775807。如果 1 TB 是 1000 ^ 4 字节,则约为 920 万 TB。据推测,使用有符号类型的原因是它可以保存 -1 的值(用于错误等)或相对偏移量。

函数类似于fseek()ftell()使用一个已签名的long,它在 64 位 GNU 系统上也是 64 位。


1.见types.htypesizes.h/usr/include/bits

  • 它由类型“off_t”绑定。在接下来的几年里,这将被“typedef”为 int64。然而历史告诉我们这将会改变,它曾经是32位的。因此,请始终使用正确的类型“off_t”,否则您的程序将变得过时。(不是`size_t`:在32位系统中`size_t`是32位,`off_t`不是) (2认同)