我有一个用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;
}

尽管正在创建输出文件“myfile”,但是对于任何大于我请求的2GB的大小,其大小始终为2GB(2147479552字节)。malloc()成功分配了请求大小的内存(在这种情况下,“allocated”为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
    

    这可能是什么原因?

    加成:
    得到两个响应后,我添加了重试代码,如下所示:
    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;
    }
    

    最佳答案

    根据man page(强调我的意思)

    10-06 11:24