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;

显然,这包含一个竞争条件,因为文件大小可能会在检查和访问映射之间发生变化。如何避免这种情况?

4

1 回答 1

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 安装一个信号处理程序(默认是崩溃程序)

于 2013-03-28T14:19:45.810 回答