Differenze tra le versioni di "Creare una mappatura della memoria mediante mmap()"

Da Gambas-it.org - Wikipedia.
(Redirect alla pagina Mmap ())
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
La funzione della libreria di C
+
#REDIRECT [[Mmap ()]]
''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 <FONT color=#B22222>Extern mmap</font>(_addr As Pointer, _len As Integer, _prot As Integer, flags As Integer, _fd As Integer, off_t As Integer) As Pointer In "<FONT color=#B22222>libc:6</font>"
 
 
 
 
 
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          <FONT color=gray>' ''Data can be read''</font>
 
Private Const MAP_PRIVATE As Byte = 2        <FONT color=gray>' ''Changes are private''</font>
 
Private Const MAP_FAILED As Integer = -1    <FONT color=gray>' ''Return value of `mmap' in case of an error''</font>
 
     
 
Library "libc:6" 
 
 
 
<FONT color=gray>' ''long sysconf(int name)''
 
' ''Restituisce il valore del parametro di sistema "name".''</font>
 
Private Extern sysconf(name As Integer) As Long 
 
     
 
<FONT color=gray>' ''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.''</font>
 
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    <FONT color=gray>' ''numero d'indice 'esemplificativo' di partenza dei byte da leggere''</font>
 
 
  lung = 5        <FONT color=gray>' ''quantità 'esemplificativa' dei byte da leggere''</font>
 
     
 
  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()' !")
 
     
 
<FONT color=gray>' ''Dereferenziamo il 'Puntatore' "addr" mediante i "Memory Stream":''</font>
 
  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'''
 

Versione attuale delle 19:06, 23 set 2022

Reindirizza a: