我理解-D_FILE_OFFSET_BITS=64
导致off_t
为64位。那么-D_LARGEFILE_SOURCE
做了什么-D_FILE_OFFSET_BITS=64
没有做的事情呢?这些定义到底是做什么的?
GLIBC特性测试宏文档说明:
_LARGEFILE_SOURCE
如果定义了这个宏,则可以使用一些额外的函数来纠正以前所有标准中的一些缺点。具体来说,fseeko和ftello函数是可用的。如果没有这些函数,ISO C接口(fseek, ftell)和底层POSIX接口(lseek)之间的差异将导致问题。这个宏是作为大文件支持扩展(LFS)的一部分引入的。
这个宏使得fseeko
和ftello
可用。单独的_FILE_OFFSET_BITS
设置不能使这些功能可用。
(注意,如果您使用的是GNU的C语言方言(GCC的默认语言),则可能不需要显式地定义_LARGEFILE_SOURCE
。例如,如果您使用-std=c99
,则可以。)
另一个答案是错误的,因为_LARGEFILE_SOURCE
的文档具有误导性。_FILE_OFFSET_BITS=64
足以公开fseeko
和ftello
函数,定义为>= 200112L
的_POSIX_C_SOURCE
宏也是如此。
来自_FILE_OFFSET_BITS
上的glibc文档
如果宏定义为64,则大文件接口将替换旧的接口。也就是说,这些函数不能以不同的名称提供(就像
_LARGEFILE64_SOURCE
一样)。相反,旧的函数名现在引用了新函数,例如,对fseeko
的调用现在确实调用了fseeko64
。
始终定义_FILE_OFFSET_BITS=64
以在基于32位glibc的系统上切换到64位类型。
LFS
大文件支持(LFS),提供访问大文件所需的额外功能
- large file ==在32位架构下,大于2GB的文件
我们可以用以下两种方式编写需要LFS功能的应用程序:
-
在编译程序时定义
_LARGEFILE64_SOURCE
特性测试宏。——使用transitional LFS API
. -
在编译程序时定义值为64++的
_FILE_OFFSET_BITS
宏
_LARGEFILE64_SOURCE
在编译程序时定义_LARGEFILE64_SOURCE
特性测试宏。——使用transitional LFS API
.
这个API提供了能够处理64位文件大小和偏移量的函数。
-
这些函数与32位函数名称相同,
++,但在函数名后面加后缀64 +-。
-
这些函数包括
fopen64(), open64(), lseek64(), truncate64(), stat64(), mmap64(), setrlimit64().
-
@eg::
fd = open64(name, O_CREAT | O_RDWR, mode);
_FILE_OFFSET_BITS
在编译程序时,用值64++定义
_FILE_OFFSET_BITS
宏。
这将自动将所有相关的32位函数和数据类型转换为64位对应函数和数据类型。
-
@eg::例如
对
open()
的调用实际上被转换为对open64()的调用,而off_t
数据类型被定义为+- 64位长。 -
@ie::也就是说,
我们可以重新编译现有的程序+-来处理大文件,而不需要+-对源代码做任何更改。
和
- 使用
_FILE_OFFSET_BITS
显然比使用_LARGEFILE64_SOURCE (transitional LFS API)
简单。 -
_LARGEFILE64_SOURCE (transitional LFS API)
已废弃 -
首选
_FILE_OFFSET_BITS
Linux编程接口
- (大部分内容直接从这里复制)