Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы открыли файл в режиме только для чтения. Затем вы попытались соединить его часть в режиме чтения/записи с помощью набора MAP_SHARED. В этом контексте MAP_SHARED подразумевает, что если вы напишете в область mmap'd, ваши изменения будут привязаны к самому отображаемому файлу. Вы не можете сделать это, потому что вы открыли файл в режиме только для чтения.

MAP_PRIVATE работает, потому что записи в область mmap'd не возвращаются к исходному файлу. Когда вы пишете в регион, страницы, которые были записаны, копируются в другую область памяти, возможно, подкреплено местом подкачки.

Ответ 2

Запись в сегмент MAP_SHARED переносится в основной файл. Вы открыли файл с O_RDONLY, который конфликтует с флагом PROT_WRITE, тем самым предотвращая возможность записи MAP_SHARED в файл.

MAP_PRIVATE не переносит записи обратно в базовый файл, поэтому факт, что вы открыли файл O_RDONLY, не является проблемой.