2013-03-28 4 views
6

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?

+0

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 ' –

+1

@xtofpernaud' haben, dann haben Sie recht. Aber wenn ich es abschneide, ändert das die Datei, die dem Dateideskriptor zugeordnet ist. –

+1

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 .. –

Antwort

3

Von man mmap:

SIGBUS Attempted access to a portion of the buffer that does not correspond to the file 
     (for example, beyond the end of the file, including the case where another 
     process has truncated the file). 

So haben Sie für SIGBUS einen Signalhandler installieren (Standard-Programm zum Absturz)