2013-03-28 13 views
6

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ąć?

+0

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 –

+1

@xtofpernaud tak masz rację. Ale jeśli go skracę, to zmodyfikuje plik powiązany z deskryptorem pliku. –

+1

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 .. –

Odpowiedz

3

Od 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). 

Więc trzeba zainstalować program obsługi sygnału dla SIGBUS (domyślnie jest to awarię programu)

Powiązane problemy