Herumspielen mit mmap
Zum Spaß habe ich folgenden Code:
(.. 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 ..)
Dies funktioniert wie erwartet. Aber bevor ich dazu kam, versuchte ich…
m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
… und mmap hat einen Fehler ausgegeben mit:
mmap: Permission denied
Was ist im Allgemeinen der Unterschied zwischen den beiden Flags (Manpage ist zu diesem Thema nicht zu großzügig)? Welche Art von Erlaubnis (und wo) fehlt mir?
BEARBEITEN
Wie es normalerweise passiert … habe es teilweise herausgefunden.
Es stellt sich heraus open
brauchte ein O_RDWR
Flagge.
Gehe ich also richtig davon aus, dass:
- MAP_PRIVATE – Änderungen werden nur im Arbeitsspeicher vorgenommen, nicht auf der Festplatte gespeichert?
- MAP_SHARED – Änderungen würden auf der Festplatte gespeichert …
… aber ich speichere nirgendwo etwas auf der Festplatte, dachte ich? Nur mit Speicher arbeiten.
, O_RDONLY);
Die Datei ist schreibgeschützt. Es kann nicht als Sicherungsspeicher für a verwendet werdenPROT_READ|PROT_WRITE
mmap()ed-Bereich, da er nicht beschreibbar ist. DasMAP_PRIVATE
Mapping muss nicht in die Datei schreiben (die Datei wird nur zum Lesen verwendet, vermutlich von COW) Hinweis: Ich würde nicht erwarten, dass die Tilde-Erweiterung für open(2) funktioniert. Es würde mich wundern, wenn es funktioniert.– Wildpässer
1. März 2012 um 16:12 Uhr
Richtig, es war nur ein schneller Weg, um das eigentliche Basisverzeichnis da rauszuholen, habe nicht einmal darüber nachgedacht. Danke, der Korrektheit halber korrigiert.
– ntl0ve
1. März 2012 um 19:42 Uhr