我尝试使用 write() 函数将一大块内存写入文件(超过 2GB)但从未成功。有人可以告诉我该怎么做吗?
3 回答
假设 Linux :)
https://users.suse.com/~aj/linux_lfs.html
- 定义
_FILE_OFFSET_BITS
为 64。 (gcc -D_FILE_OFFSET_BITS=64
) - 定义
_LARGEFILE_SOURCE
和_LARGEFILE_SOURCE64
。 - 使用
O_LARGEFILE
带有 open 的标志对大文件进行操作
还有一些信息: http ://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
如今,您系统上的文件系统将支持开箱即用的大文件。
添加-D_FILE_OFFSET_BITS=64
到您的编译器命令行(又名CFLAGS
),它会工作。这在任何 64 位系统上都不是必需的,如今在某些(但不是全部)32 位系统上也是不必要的。
避免建议在您的源代码中进行写作等O_LARGEFILE
。open64
这是不可移植的,而且很简单,丑陋。
编辑:实际上,我认为我们都误读了您的问题。如果您在 32 位系统上,内存中最大可能的单个对象是 2GB-1 字节(即SSIZE_MAX
)。根据 POSIX,未定义write
不适合的 for size 参数的行为;ssize_t
这是因为write
返回类型ssize_t
,如果它更大,则无法表示写入的字节数。或许更重要的是,实现允许对象太大以至于它们的大小不适合是很危险的ptrdiff_t
,因为这会造成指针算术可能引发整数溢出并因此导致未定义行为的情况。您可能已经能够创建如此大的对象mmap
(我认为这是您系统内核或 libc 中的错误),但这是一个非常糟糕的主意,会导致各种错误。如果您需要大于 2GB 的单个对象,您确实需要在 64 位机器上运行以使其安全且无错误。
它取决于操作系统、处理器、文件系统。在 Linux/x86-64 系统(带有 ext3 文件系统)上,这很简单。只需使用通常的库函数(在 C++std::ofstream
中,在 C 中<stdio.h>
,fopen
&&fprintf
等)或底层系统调用(打开,写入)。