Я экспериментирую с mmap следующим образом, но не могу понять, правильно ли это:
#include <fcntl.h> // open
#include <unistd.h> // ftuncate
#include <sys/mman.h> // mmap
#include <cstdlib>
#include <cstring>
#include <cstdio>
int main(){
off_t const size = 5 * 1024 * 1024;
const char *filename = "testfile";
int fd = open(filename, O_RDWR | O_TRUNC | O_CREAT, 0644);
ftruncate(fd, size);
char *mem = (char *) mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, /* offset */ 0);
const char *msg = "Hello";
memcpy(&mem[100], msg, strlen(msg));
memcpy(&mem[200], msg, strlen(msg));
memcpy(&mem[4 * 1024 * 1024], msg, strlen(msg));
}
Насколько я понимаю, ftruncate
создает файл с отверстием. Разве это не проблема для mmap
позже?
Будет ли это работать с файлом размером 10 ГБ в 64-битной системе?
На Linux я должен использовать fallocate(fd, FALLOC_FL_ZERO_RANGE, 0, 8 * size)
или нет существенная разница в скорости?