Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
Linux 文件指针宽度和最大文件大小之间的关系是什么_Linux_File_Filesystems_Size_32 Bit - Fatal编程技术网

Linux 文件指针宽度和最大文件大小之间的关系是什么

Linux 文件指针宽度和最大文件大小之间的关系是什么,linux,file,filesystems,size,32-bit,Linux,File,Filesystems,Size,32 Bit,我对Linux上一些流行的文件系统提供的最大文件大小限制感到好奇,我看到一些文件系统达到了TB级 我的问题是,如果文件指针是32位宽,就像我们今天遇到的大多数Linux一样,这是否意味着我们可以处理的最大距离是2^32-1字节?那么我们如何存储大于4GB的文件呢 此外,即使我们可以存储这样的文件,我们如何定位超出2^32范围的位置?只需反复调用read(int-fd,void*buf,size\t-count) (因此不需要向文件中插入“指针”。) 从文件系统设计的角度来看,您基本上拥有一个索引

我对Linux上一些流行的文件系统提供的最大文件大小限制感到好奇,我看到一些文件系统达到了TB级

我的问题是,如果文件指针是32位宽,就像我们今天遇到的大多数Linux一样,这是否意味着我们可以处理的最大距离是2^32-1字节?那么我们如何存储大于4GB的文件呢


此外,即使我们可以存储这样的文件,我们如何定位超出2^32范围的位置?

只需反复调用
read(int-fd,void*buf,size\t-count)

(因此不需要向文件中插入“指针”。)


从文件系统设计的角度来看,您基本上拥有一个索引树(inode),它指向构成实际文件的几段数据(块)。使用此模型,理论上可以获得文件的infinte大小。

UNIX对文件大小的实际物理限制由32位文件指针可以索引的字节数决定,约为2.4 GB

考虑在第一个文件的长度达到0x7fffffff字节之前关闭它,并打开另一个新文件

ext2文件系统存在一些限制的原因是数据的文件格式和操作系统的内核。大多数情况下,这些因素将在构建文件系统时确定。它们取决于块大小以及块数和索引节点数的比率。在Linux中,块大小受体系结构的限制

还有一些用户空间程序无法处理


最大文件大小限制为
min((b/4)3+(b/4)2+b/4+12,232*b)
,因为
i_块(EXT2_N_块的数组)
i_块(32位整数值)
表示文件中b字节“块”的数量。

要使用大于4 GB的文件,需要Linux上的“大文件支持”(LFS)。LFS引入的变化之一是文件偏移量是64位数字。这与Linux本身是以32位还是64位模式运行无关(例如x86与x86-64)。见例

LFS主要是在Glibc2.2和内核2.4.0(大约在2000-2001年)中引入的,因此任何最近的Linux发行版都会有LFS


要在Linux上使用它,您可以使用特殊的函数(例如,
lseek64
而不是
lseek
),或者设置
#定义(u FILE)偏移量(u BITS 64)
,然后常规函数将使用64位偏移量。

在Linux中,至少明确编写处理较大文件的程序是很简单的(即,不只是使用Kohlehydate建议的流式方法)


例如,请参见。诀窍通常归结为在包含一些系统头之前有一个神奇的
#define
,它“打开”了“大文件支持”。这通常会将文件偏移量类型的大小增加一倍,达到64位,这相当多。

您可以使用
lseek64
处理大文件。Ext4可以处理16个TiB文件。

没有任何关系。来自C stdio的
文件*
指针是一个不透明的句柄,与磁盘上文件的大小无关,而它指向的内存也可能比指针本身大得多。函数
fseek()
,用于重新定位我们读写的位置,已经需要
,并且
fgetpos()
fsetpos()
使用不透明的
fpos\u t

使处理大文件变得困难的是在各种系统调用中用作偏移量的
off\t
。幸运的是,人们意识到这将是一个问题,并提出了“大文件支持”(LFS),这是一种经过修改的ABI,偏移量类型
off\t
。(这通常是通过引入一个新的API来实现的,并且
#定义
使用旧名称来调用这个新API。)