c—“_LARGEFILE_SOURCE”和“_FILE_OFFSET_BITS=64”有什么区别?



我理解-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)的一部分引入的。

这个宏使得fseekoftello可用。单独的_FILE_OFFSET_BITS设置不能使这些功能可用。

(注意,如果您使用的是GNU的C语言方言(GCC的默认语言),则可能不需要显式地定义_LARGEFILE_SOURCE。例如,如果您使用-std=c99,则可以。)

另一个答案是错误的,因为_LARGEFILE_SOURCE的文档具有误导性。_FILE_OFFSET_BITS=64足以公开fseekoftello函数,定义为>= 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编程接口

  • (大部分内容直接从这里复制)

相关内容

  • 没有找到相关文章

最新更新