Я использую 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;
Очевидно, это содержит условие гонки, потому что размер файла может изменяться между проверкой и доступом к сопоставлению. Как этого можно избежать?
От 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 (по умолчанию происходит сбой программы)
Других решений пока нет …