2013-03-28 11 views
6

Sto usando Qt per mappare un file a un pezzo di pagine di memoriaCome posso garantire che un file mappato in memoria mantenga accessibili le pagine di memoria?

QFile::map (qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions) 

Essenzialmente, questo dovrebbe essere una chiamata di funzione di sistema mmap. Mi chiedo come posso garantire di poter accedere alla memoria restituita, anche se il file su disco viene troncato. Mi sembra di bisogno di questo perché ho letto da un file su disco e voglio gestire correttamente gli errori

if (offset > m_file.size()) 
    // throw an error... 
if (m_mappedFile != NULL) return m_mappedFile + offset; 

Ovviamente, questo contiene una condizione di competizione, perché la dimensione del file può variare tra il controllo e l'accesso alla mappatura. Come può essere evitato?

+0

un file non cessare di esistere, mentre ci sono alcuni descrittori aperte che vi fanno riferimento - 'open()' ed o 'mmap()' ed. Anche se un altro processo emette un 'remove()', o se si 'rm' esso dalla shell –

+1

@xtofpernaud si hai ragione. Ma se lo troncamento, questo modificherà il file associato al descrittore di file. –

+1

Da man mmap: 'SIGBUS tentativo di accesso ad una porzione del buffer che non corrisponde al file (ad esempio, oltre la fine del file, incluso il caso in cui un altro processo ha troncato il file)'. Se questo può accadere nel tuo codice, potresti avere un handle di SIGBUS .. –

risposta

3

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

quindi bisogna installare un gestore di segnale per SIGBUS (di default è quella di crash del programma)

Problemi correlati