ich Qt verwende eine Datei an einem Stück von Speicherseiten im WesentlichenWie kann ich sicherstellen, dass eine Memory-Mapped-Datei die Speicherseiten zugänglich hält?
QFile::map (qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)
abzubilden, sollte dies ein mmap
Systemfunktionsaufruf sein. Ich frage mich, wie ich garantieren kann, dass ich auf den zurückgegebenen Speicher zugreifen kann, selbst wenn die Datei auf der Festplatte abgeschnitten ist. Ich scheine dies zu brauchen, weil ich aus einer Datei lesen und wollen graziös Fehler behandeln
if (offset > m_file.size())
// throw an error...
if (m_mappedFile != NULL) return m_mappedFile + offset;
Offensichtlich ist dies enthält eine Race-Bedingung, da die Dateigröße zwischen der Kontrolle und den Zugriff auf die Mapping ändern in kann. Wie kann dies vermieden werden?
Eine Datei nicht aufhört zu existieren, während es einige geöffnet Deskriptoren sind, die darauf verweisen - 'open()' ed oder 'mmap()' ed. Selbst wenn ein anderer Prozess ein 'remove()' ausgibt, oder wenn Sie es von der Shell aus ' –
@xtofpernaud' haben, dann haben Sie recht. Aber wenn ich es abschneide, ändert das die Datei, die dem Dateideskriptor zugeordnet ist. –
Von man mmap: 'SIGBUS Versuchte Zugriff auf einen Teil des Puffers, der nicht der Datei entspricht (z. B. über das Ende der Datei hinaus, einschließlich des Falls, bei dem ein anderer Prozess die Datei abgeschnitten hat). Wenn dies in Ihrem Code passieren kann, haben Sie vielleicht Griff SIGBUS .. –