Domanda

Ho preso in considerazione utilizzando mmap per la lettura di file, e si chiedeva come portatile che sia. Sto sviluppando su una piattaforma Linux, ma vorrei il mio programma per lavorare su Mac OS X e Windows.

Posso supporre mmap sta lavorando su queste piattaforme?

È stato utile?

Soluzione

Il href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html" rel="nofollow noreferrer"> mmap() funzione

L'area problema sarà Windows. Io non sono sicuro se c'è una chiamata in _mmap() 'compatibilità' sotto-sistema POSIX. E 'probabile che sia lì - ma avrà il nome con l'underscore perché Microsoft ha una visione alternativa sul namespace e considera mmap() intromettermi sullo spazio nome utente, anche se chiedete per la funzionalità POSIX. È possibile trovare una definizione di un'interfaccia alternativa di Windows MapViewOfFile() e discussione su prestazioni in un altro domanda SO ( mmap() vs blocchi di lettura .

Se si tenta di mappare file di grandi dimensioni su un sistema a 32 bit, si possono trovare non c'è abbastanza spazio contiguo di destinare l'intero file in memoria, in modo che il mapping di memoria avrà esito negativo. Non date per scontato che funzionerà; decidere che cosa la vostra strategia di fallback è se fallisce.

Altri suggerimenti

Utilizzando mmap per la lettura di file non è portabile se si basano su mappatura di grandi frammenti di file di grandi dimensioni nel vostro spazio di indirizzi - sistemi a 32 bit può facilmente non avere un unico grande spazio utilizzabile - dire 1G - di spazio di indirizzi disponibili, in modo mmap fallirebbe abbastanza spesso per una mappatura 1G.

Il principio di un file di memoria mappata è abbastanza portatile, ma non avete mmap () su Windows (ma esistono cose come MapViewOfFile ()). Si potrebbe dare un'occhiata al codice moduli python mmap c per vedere come lo fanno per diverse piattaforme.

considero memoria mappata IO UNIXs non utilizzabile per le applicazioni interattive, in quanto può provocare un SIGSEGV / SIGBUS (In caso di file è stato troncato nel frattempo con altro processo). Ignorando queste "soluzioni" malato come setjmp / longjmp non c'è niente che si può fare altro che terminare il processo dopo aver ottenuto SIGSEGV / SIGBUS. La funzione nuova G ++ per convertire tali segnali in eccezioni sembra essere destinato principalmente per le mele OS, poiché la descrizione stati, che bisogna supporto runtime per questo caratteristica G ++ e non ci sono informazioni si trovano su questo G ++ caratteristica ovunque. Probabilmente abbiamo dovuto aspettare un paio d'anni, fino a quando la gestione delle eccezioni strutturata come si può trovare sulle finestre da più di 20 anni fa la sua strada in UNIXs.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top