Sind Änderungen an mmap MAP_PRIVATE für den aktuellen Prozess sichtbar?
Die mmap-Manpage sagt uns, ob Änderungen im Speicher, die an einer MAP_PRIVATE-Memory-Mapped-Datei vorgenommen wurden, für den Prozess, der die Datei mapped, sichtbar sind, ist nicht spezifiziert (sie werden nicht in die gemappte Datei geschrieben noch werden sie für andere Prozesse sichtbar sein, die dieselbe Datei mappen).
Wir können jedoch überprüfen, ob Änderungen auf einem bestimmten System / Kernel tatsächlich sichtbar sind, indem wir dieses Testprogramm verwenden:
#include <string>
#include <iostream>
#include <fstream>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
#include <sys/stat.h>
using namespace std;
int main() {
string filename = "deleteme.txt";
// Create file
ofstream fout(filename.c_str());
fout << "ABCD";
fout.close();
// Create & open underlying file
int fd = open(filename.c_str(), O_RDONLY);
assert(fd != -1);
// mmap with MAP_PRIVATE and allow writes to the mmapped pages
char* mmappedData = (char*)mmap(NULL, 4, PROT_WRITE, MAP_PRIVATE | MAP_POPULATE, fd, 0);
assert(mmappedData != MAP_FAILED);
// Insert data into the MAP_PRIVATE area
mmappedData[0] = 0;
mmappedData[1] = 1;
mmappedData[2] = 2;
mmappedData[3] = 3;
// Overwrite once more
mmappedData[0] = 3;
mmappedData[1] = 2;
mmappedData[2] = 1;
mmappedData[3] = 0;
// Check data
if(mmappedData[0] == 3 &&
mmappedData[1] == 2 &&
mmappedData[2] == 1 &&
mmappedData[3] == 0) {
cout << "Congrats, MAP_PRIVATE changes are reflected in memory!" << endl;
} else {
cout << "Nope, MAP_PRIVATE changes are NOT reflected in memory!" << endl;
}
}Herunterladen, kompilieren und ausführen mit:
wget https://techoverflow.net/scripts/mmap-private-check.cpp && g++ -o mmap-private-check mmap-private-check.cpp && ./mmap-private-checkDies wird entweder ausgeben
Congrats, MAP_PRIVATE changes are reflected in memory!(Ich habe dieses Ergebnis nur für jedes Linux-System erhalten, auf dem ich getestet habe, z.B. auf Ubuntu 18.04) oder
Nope, MAP_PRIVATE changes are NOT reflected in memory!Beachte, dass dieses Programm nur die Sichtbarkeit der Änderungen direkt nach dem Schreiben der Daten testet. Im Prinzip darf der Kernel deine Änderungen zu einem späteren Zeitpunkt einfach verwerfen. Beachte also, dass du hier auf dem schmalen Grat lebst, Änderungen an MAP_PRIVATE-Speicher sind nicht inhärent sicher, aber in der Praxis funktionieren sie oft sehr gut.