我正在使用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;
显然,这里存在竞态条件,因为文件大小在检查和访问映射之间可能会发生变化。如何避免这种情况?
open()
或mmap()
,文件就不会停止存在。即使另一个进程发出remove()
,或者您从shell中使用rm
删除它。 - xtof pernodSIGBUS尝试访问与文件不对应的缓冲区部分(例如超出文件末尾,包括另一个进程截断文件的情况)
。如果您的代码可能会出现这种情况,则需要处理SIGBUS。 - xtof pernodmmap()
一个文件时,其他人可以随时truncate()
,可能会丢失数据.. - xtof pernod