2013-03-28 40 views
6

我使用Qt的一個文件映射到一塊內存頁如何確保內存映射文件保持內存頁可訪問?

QFile::map (qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions) 

從本質上講,這應該是一個mmap系統功能調用。我想知道如何保證我可以訪問返回的內存,即使磁盤上的文件被截斷。我似乎需要這一點,因爲我是從一個磁盤文件中讀取並要妥善處理錯誤

if (offset > m_file.size()) 
    // throw an error... 
if (m_mappedFile != NULL) return m_mappedFile + offset; 

顯然,這包含了競爭條件,因爲文件的大小可能會在檢查和訪問地圖之間切換。這怎麼可以避免?

+0

文件不不復存在,同時也有引用它的一些打開的描述符 - 'open()'ed或'mmap()'編輯。即使另一個進程發出「remove()」,或者如果你從shell中運行「rm」 – 2013-03-28 11:11:00

+1

@xtofpernaud,你是對的。但是,如果我截斷它,那將修改與文件描述符關聯的文件。 – 2013-03-28 11:20:27

+1

從man mmap:'SIGBUS試圖訪問與文件 不對應的緩衝區的一部分(例如,超出文件末尾,包括另一個 進程已截斷文件)。如果這可能發生在你的代碼中,那麼你可能有許多SIGBUS .. – 2013-03-28 11:29:33

回答

3

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

所以你必須安裝SIGBUS信號處理器(默認是崩潰節目)