Прежде всего, код даже не скомпилируется на моем Debian Box.Насколько мне известно, O_READ не является правильным флагом для open ().
Затем вы сначала используете fd
в качестве дескриптора файла и используете его в качестве счетчика в цикле for.
Я не понимаю, что вы пытаетесь сделать, но я думаю, что вы неправильно поняли, что mmap
.
mmap
используется для отображения файла в память, таким образом, выможет читать / записывать в созданное отображение памяти вместо использования функций для доступа к файлу.
Вот короткая программа, которая открывает файл, отображает его в памяти и печатает указатель возвращающего:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
int fd;
int result;
int len = 1024 * 1024;
fd = open("hello",O_RDWR | O_CREAT | O_TRUNC, (mode_t) 0600);
// stretch the file to the wanted length, writting something at the end is mandatory
result = lseek(fd, len - 1, SEEK_SET);
if(result == -1) { perror("lseek"); exit(1); }
result = write(fd, "", 1);
if(result == -1) { perror("write"); exit(1); }
char*addr = mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (addr==MAP_FAILED) { perror("mmap"); exit(1); }
printf("mmap returned %p, which seems readable and writable\n",addr);
result = munmap(addr, len);
if (result == -1) { perror("munmap"); exit(1); }
close(fd);
return 0;
}
Я пропустил цикл for, так как не понимал его цели.Поскольку вы создаете файл и хотите отобразить его на заданную длину, мы должны также «растянуть» файл до заданной длины.
Надеюсь, это поможет.