Играю с mmap
для удовольствия, у меня есть следующий код:
(.. snip ..)
fd = open("/home/me/straight_a.txt", O_RDONLY);
if (fd == -1) {
perror("open");
exit(1);
}
m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0);
if (m == MAP_FAILED) {
perror("mmap");
exit(1);
}
printf("m is %p\n", m);
printf("*m = %c\n", *m);
printf("*(m+1) = %c\n", *(m+1));
(.. snip ..)
Это работает, как и ожидалось.Но прежде чем я дошел до этого, я попытался ...
m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
... и mmap выдал ошибку:
mmap: Permission denied
В общем, в чем разница между двумя флагами (справочная страница не щедра на эту тему)?Какого рода разрешение (и где) я пропускаю?
РЕДАКТИРОВАТЬ
Как это обычно бывает .. частично понял.
Оказываетсяopen
нужен флаг O_RDWR
.
Итак, правильно ли я считать, что:
- MAP_PRIVATE - изменения вносятся только в память, а не сохраняются на диск?*
- MAP_SHARED - изменения будут сохранены на диск ...
... но я нигде ничего не сохраняю, подумал я?Просто работает с памятью.