2010-01-25 6 views
5

Ich habe überlegt, mmap für FileReading zu verwenden, und fragte mich, wie portabel das ist. Ich entwickle auf einer Linux-Plattform, aber möchte mein Programm auf OSX und Windows arbeiten.Wie portabel ist mmap

Kann ich annehmen, dass mmap auf diesen Plattformen funktioniert?

dank

Antwort

8

Die Funktion 'mmap()' ist ein POSIX-Aufruf. Es funktioniert gut unter MacOS X (und Linux und HP-UX und AIX und Solaris).

Der Problembereich wird Windows sein. Ich bin mir nicht sicher, ob es einen _mmap() Aufruf im POSIX 'Kompatibilität' Subsystem gibt. Es ist wahrscheinlich, dort zu sein - aber wird den Namen mit der führenden Unterstreichung haben, weil Microsoft eine alternative Sicht auf Namespaces hat und mmap() in den Benutzernamenraum eindringen, selbst wenn Sie nach POSIX-Funktionalität fragen. Sie können eine Definition einer alternativen Windows-Schnittstelle finden MapViewOfFile() und Diskussion über die Leistung in einem anderen Frage.

2

Das Prinzip eines Dateispeicher abgebildet ist ziemlich beweglich, aber Sie haben nicht mmap() unter Windows (aber Dinge wie MapViewOfFile() vorhanden sind). Sie können einen Blick auf die C-Code Python mmap-Module werfen, um zu sehen, wie sie es für verschiedene Plattformen tun.

3

Verwenden von mmap zum Lesen von Dateien ist nicht portierbar, wenn Sie große Dateien große Dateien in Ihren Adressraum zuordnen - 32-Bit-Systeme können leicht nicht einen einzigen großen nutzbaren Speicherplatz - sagen 1G - von Adressraum verfügbar mmap würde bei einem 1G-Mapping häufig fehlschlagen.

2

Ich halte Speicher gemappt io auf UniXS als nicht verwendbar für interaktive Anwendungen, wie es in einem SIGSEGV/SIGBUS (im Fall der Datei inzwischen von einem anderen Prozess wurde abgeschnitten) führen kann. Ignorieren solche sick "Lösungen" wie setjmp/longjmp gibt es nichts anderes als den Prozess nach dem Abrufen von SIGSEGV/SIGBUS zu beenden. Die neue G ++ - Funktion zum Umwandeln solcher Signale in Ausnahmen scheint hauptsächlich für Äpfel OS, bestimmt zu sein, da die Beschreibung besagt, dass man Laufzeitunterstützung für dieses G ++ Feature benötigt und es keine Informationen zu dieser G ++ Funktion gibt . Wir müssen wahrscheinlich ein paar Jahre warten, bis eine strukturierte Ausnahmebehandlung, wie sie unter Windows zu finden ist, seit mehr als 20 Jahren Einzug in UNIX hält.

+0

Obwohl Sie die Frage nicht direkt beantwortet haben, fand ich das wirklich hilfreich, danke. –

+0

Speicherabbild, das nicht für nicht triviale Anwendungen auf UNIX-Systemen verwendet werden kann, beeinträchtigt die Portabilität von Speicherabbildungssystemen –