我有一个由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.
环境如下
汇编:
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)