Differenze tra le versioni di "Creare una mappatura della memoria mediante mmap()"
Da Gambas-it.org - Wikipedia.
Riga 27: | Riga 27: | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | Dim percorsoFile As String | + | Dim percorsoFile As String |
+ | Dim fl as File | ||
Dim addr As Pointer | Dim addr As Pointer | ||
Dim lungh_file, lung, i As Integer | Dim lungh_file, lung, i As Integer | ||
Riga 42: | Riga 43: | ||
lung = 5 <FONT color=gray>' ''quantità 'esemplificativa' dei byte da leggere''</font> | lung = 5 <FONT color=gray>' ''quantità 'esemplificativa' dei byte da leggere''</font> | ||
− | + | fl = Open percorsoFile For Read | |
− | If IsNull( | + | If IsNull(fl) Then Error.Raise("Impossibile aprire il file !") |
pa_offset = initium And (Not (sysconf(_SC_PAGE_SIZE) - 1)) | pa_offset = initium And (Not (sysconf(_SC_PAGE_SIZE) - 1)) | ||
Riga 55: | Riga 56: | ||
Endif | Endif | ||
− | addr = mmap(0, lung + initium - pa_offset, PROT_READ, MAP_PRIVATE, | + | addr = mmap(0, lung + initium - pa_offset, PROT_READ, MAP_PRIVATE, fl.Handle, pa_offset) |
If addr = MAP_FAILED Then Error.Raise("Errore alla funzione 'mmap()' !") | If addr = MAP_FAILED Then Error.Raise("Errore alla funzione 'mmap()' !") | ||
Riga 65: | Riga 66: | ||
Read #st, b | Read #st, b | ||
Print b | Print b | ||
− | Next | + | Next |
+ | |||
+ | st.Close | ||
+ | fl.Close | ||
'''End''' | '''End''' |
Versione delle 18:41, 12 mar 2014
La funzione della libreria di C
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
crea una nuova mappatura nello spazio di indirizzi virtuali del processo chiamante. L'indirizzo di partenza per la nuova mappatura è specificato in addr. L'argomento length specifica la lunghezza della mappatura.
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:
Private Extern mmap(_addr As Pointer, _len As Integer, _prot As Integer, flags As Integer, _fd As Integer, off_t As Integer) As Pointer In "libc:6"
L'esempio che segue scrive in console una parte di un file. L'intervallo di byte da mostrare in console viene specificato tramite la variabile initium ed il valore della variabile lung. Il programma crea una mappatura della memoria delle pagine richieste del file e successivamente scrive in console i byte prescelti:
Private Const _SC_PAGE_SIZE As Byte = 30 Private Const PROT_READ As Byte = 1 ' Data can be read Private Const MAP_PRIVATE As Byte = 2 ' Changes are private Private Const MAP_FAILED As Integer = -1 ' Return value of `mmap' in case of an error Library "libc:6" ' long sysconf(int name) ' Restituisce il valore del parametro di sistema "name". Private Extern sysconf(name As Integer) As Long ' void *mmap (void *__addr, size_t __len, int __prot, int __flags, int __fd, __off_t __offset) __THROW ' Map addresses starting near ADDR and extending for LEN bytes. Private Extern mmap(_addr As Pointer, _len As Integer, _prot As Integer, flags As Integer, _fd As Integer, off_t As Integer) As Pointer Public Sub Main() Dim percorsoFile As String Dim fl as File Dim addr As Pointer Dim lungh_file, lung, i As Integer Dim initium, pa_offset As Long Dim st As Stream Dim b As Byte percorsoFile = "/percorso/del/file/da/leggere" lungh_file = Stat(percorsoFile).Size initium = 8 ' numero d'indice 'esemplificativo' di partenza dei byte da leggere lung = 5 ' quantità 'esemplificativa' dei byte da leggere fl = Open percorsoFile For Read If IsNull(fl) Then Error.Raise("Impossibile aprire il file !") pa_offset = initium And (Not (sysconf(_SC_PAGE_SIZE) - 1)) If initium >= lungh_file Then Error.Raise("Il valore dell variabile 'initium' ha oltrepassato la fine del file !") If lung > 0 Then If initium + lung > lungh_file Then lung = lungh_file - initium Else lung = lungh_file - initium Endif addr = mmap(0, lung + initium - pa_offset, PROT_READ, MAP_PRIVATE, fl.Handle, pa_offset) If addr = MAP_FAILED Then Error.Raise("Errore alla funzione 'mmap()' !") ' Dereferenziamo il 'Puntatore' "addr" mediante i "Memory Stream": st = Memory addr For Read For i = 0 To lung - 1 Seek #st, (initium - pa_offset) + i Read #st, b Print b Next st.Close fl.Close End