O_LARGEFILE是否只需要用来写大文件?

13

如果我想要写一个大文件 (O_WRONLY) 或者追加到一个大文件 (O_APPEND | O_WRONLY),是否需要使用 O_LARGEFILE标志?

从 CLucene-dev 邮件列表中一个名为 "Cannot write >2gb index file" 的帖子中可以看出,似乎需要使用 O_LARGEFILE 来写入大文件。但是,在该讨论中的参与者使用的是 O_RDWR,而不是 O_WRONLY,因此我不确定。

2个回答

18

O_LARGEFILE 不应该直接被应用程序使用。它是由 glibc 中具有 64 位偏移量兼容版本的 open 在调用内核(Linux 或可能是另一个将 64 位偏移量模式视为二等公民的内核)时内部使用的。只需确保在 CFLAGS 中始终包括 -D_FILE_OFFSET_BITS=64,您就永远不必担心任何问题。


2
你有任何关于 O_LARGEFILE 不应该被使用的来源吗? - dmeister
所以你的意思是,O_LARGEFILE就像一个限制一样?肯定有某个原因存在这个标记。 - kirugan
1
在32位系统上,使用-D_FILE_OFFSET_BITS=64选项的open版本会透明地向内核传递O_LARGEFILE。而使用32位off_t的版本则不会。这反过来决定了POSIX语言中“打开文件描述符中建立的最大偏移量”,从而导致许多函数在产生无法表示为32位off_t的文件偏移量时报告错误。最大值与打开的文件描述符相关联,而不是进程,因为打开的文件描述符可以在进程之间共享。 - R.. GitHub STOP HELPING ICE
无论如何,没有任何理由自己去操作 O_LARGEFILE。如果您在32位系统上使用64位的 off_t,它会自动设置,否则(在64位系统上或者32位系统上使用32位 off_t),不应该设置。 - R.. GitHub STOP HELPING ICE
POSIX是否提到了_FILE_OFFSET_BITS?你能提供链接吗? - Ciro Santilli OurBigBook.com
显示剩余2条评论

12

IIRC如果您这样做

#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64

在所有其他包含文件之前,您不需要传递此标志。

此外请参见


8
只需要使用 _FILE_OFFSET_BITS,不需要使用 _LARGEFILE_SOURCE - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接