我有一个用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。
环境如下
汇编:
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(强调我的意思)