zabawy z mmap
dla zabawy, mam następujący kod:Jaka jest różnica między MAP_SHARED i MAP_PRIVATE w funkcji 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 ..)
to działa zgodnie z oczekiwaniami. Ale zanim dostałem się do tego, próbowałem ...
m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
... i mmap błędami się z:
mmap: Permission denied
W ogóle, jaka jest różnica między tymi dwoma flagami (mężczyzna strona ISN” hojny na ten temat)? Jakiego rodzaju pozwolenie (i gdzie) brakuje mi?
EDIT
Jak to zwykle bywa, .. częściowo zdobione.
Okazało się, że open
potrzebna jest flaga O_RDWR
.
Więc mam rację przyjąć, że:
- MAP_PRIVATE - zmiany dokonywane są tylko w pamięci, a nie zapisane na dysku?
- MAP_SHARED - zmiany zostaną zapisane na dysku ...
... ale ja nie oszczędzając niczego na dysku w dowolnym miejscu, pomyślałem? Po prostu działa na pamięć.
', O_RDONLY);' Plik jest tylko do odczytu. Nie można go używać jako pamięci masowej dla obszaru 'PROT_READ | PROT_WRITE' mmap() ed, ponieważ nie jest on zapisywalny. Mapowanie "MAP_PRIVATE" nie musi zapisywać do pliku (plik jest używany tylko do odczytu, prawdopodobnie przez COW) Uwaga: Nie oczekiwałbym, że rozszerzenie tyldy zadziała dla open (2). Byłbym zdumiony, gdyby to zadziałało. – wildplasser
Otóż, był to tylko szybki sposób, aby zdobyć prawdziwą bazę, nawet o tym nie myśleć. Dzięki, ustalone dla poprawności. – ntl0ve