无法写入(2)大于2GB的文件(最高2TB)

eii*_*000 2 c

我有一个由C编写的程序.它计算一些东西并将输出写入文件.我的问题是它写的不超过2GB.让我把一个简化的代码.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <malloc.h>
#include <errno.h>
int main() {
    size_t size = 3221225472LL;
    char *map = malloc(size);
    size_t allocated = malloc_usable_size(map);
    int fd = open("myfile", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0644);
    ssize_t written = write(fd, map, size);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然正在创建输出文件"myfile",但是对于我请求的大小超过2GB的大小,大小总是2GB(2147479552字节).malloc()成功分配了所请求大小的内存(在这种情况下,"已分配"为3GB ).write()之后的errno为0.

环境如下

  • 操作系统:Ubuntu 16.04.1 x86_64
  • 物理内存大小:32GB
  • 文件系统:ext4

汇编:

gcc code.c -D_FILE_OFFSET_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
Run Code Online (Sandbox Code Playgroud)

这可能是什么原因?

补充:收到两个回复后,我添加了重试代码如下:

int main() {
    size_t size = 3221225472LL;
    char *map = malloc(size);
    size_t allocated = malloc_usable_size(map);
    int fd = open("myfile", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0644);
    ssize_t written = write(fd, map, size);
    while (written < size) {
        written += write(fd, &map[written], size-written);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

phu*_*clv 13

根据手册页(强调我的)

在Linux上,write()(和类似的系统调用)将最多传输0x7ffff000(2,147,479,552)字节,返回实际传输的字节数.(在32位和64位系统上都是如此.)