我正在使用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 :(得分: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安装信号处理程序(默认是崩溃程序)