używam Qt zmapować plik do kawałka stron pamięciJak mogę się upewnić, że plik mapowany w pamięci zachowuje dostęp do stron pamięci?
QFile::map (qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)
Zasadniczo powinno to być wywołanie funkcji systemu mmap
. Zastanawiam się, w jaki sposób mogę zagwarantować, że mogę uzyskać dostęp do zwróconej pamięci, nawet jeśli plik na dysku jest obcięty. Wydaje mi się to potrzebne, bo czytać z pliku na dysku i chcesz bezpiecznie obsłużyć błędy
if (offset > m_file.size())
// throw an error...
if (m_mappedFile != NULL) return m_mappedFile + offset;
Oczywiście, to zawiera warunek wyścigu, ponieważ rozmiar pliku może się zmieniać między kontroli i dostępu do mapowania. Jak można tego uniknąć?
Plik nie przestaje istnieć, gdy istnieją otwarte deskryptory, które go odwołujące - 'open()' ed lub 'mmap()' ed. Nawet jeśli inny proces wywołuje 'remove()' lub jeśli 'rm' to z powłoki –
@xtofpernaud tak masz rację. Ale jeśli go skracę, to zmodyfikuje plik powiązany z deskryptorem pliku. –
Od man mmap: 'SIGBUS Próba dostępu do części bufora, która nie jest zgodna z plikiem (na przykład poza końcem pliku, w tym przypadkiem, w którym inny proces skrócił plik)'. Jeśli to może wystąpić w twoim kodzie, możesz mieć tonę w obsłudze SIGBUS .. –