В чем разница между MAP_SHARED и MAP_PRIVATE в функции mmap?

Играя с 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 - изменения будут сохранены на диск ...

... но Я подумал, что я ничего никуда на диск не сохраняю? Просто работает с памятью.

13
задан Ciro Santilli 新疆改造中心法轮功六四事件 23 August 2017 в 06:51
поделиться