View Full Version : [C] mapped memory, io ci provo...
Garet Jax
13-11-2007, 15:57
Ciao a tutti,
sto cercando di imparare a gestire le mapped memory in linux.
Al momento riesco seplicemente a "mappare in memoria" un file, ma non ho la minima idea di come scriverc all'interno.
Per esempio:
ammettiamo che io mappi un file (aperto in append) di interi in memoria e tutto vada per il meglio, come faccio ad scriveeci un ulteriore intero?
Jax
ilsensine
13-11-2007, 16:25
(aperto in append)
Ininfluente per un memory mapped file. Basta che non usi O_TRUNC.
come faccio ad scriveeci un ulteriore intero?
ftruncate + mmap della regione che ti interessa + scrittura sulla mappa
Garet Jax
13-11-2007, 22:44
scusa ma non ho capito...
va bene se faccio cosi?
int numero = 5;
...
mappedmem = mmap(...);
mappedmem = (void*) numero;
la tratto come se fosse una variabile normale, o no?
è che non ho trovato esempi, quindi in sostanza non le so trattare...
azz...
che figura... :cry:
ilsensine
14-11-2007, 12:44
Cosa devi fare esattamente? La mmap su file si usa in casi particolari.
Garet Jax
14-11-2007, 16:21
nulla di particolare, devo imparare a gestirle ed usarle.
Potrebbero capitarmi come domanda in un esame.
Per imparare a gestirle intendo, "allocarla", modificarla e "deallocarla".
Successivamente dovrei usarle come canale comunicativotra processi.
I tipi di file che potrebbero caprtarmi non vanno oltre gli interi, caratteri o stringhe...
al massimo, ma proprio in casi estremi, strutture...
Jax
ilsensine
14-11-2007, 16:39
La mmap sembra semplice ma è alquanto sofisticata; inizia con qualche semplice esempio.
Questo ad esempio implementa la copia di file tramite la mmap:
http://www.stillhq.com/extracted/howto-mmap/copy.c
Tieni conto che moltissime cose possono essere messe in memory map (non solo i file, ma anche i block device, spesso i char device, la memoria "anonima", ecc.) e che c'è una differenza profonda tra le mappe "shared" e le mappe "private".
Garet Jax
14-11-2007, 23:29
mmm
okay
più o meno ci sono anche se ho dei quesiti (che fa la "fstat"?, che serve? e la ftruncate?)
quindi mi casto il puntaore void che mi restituitsce mmap, al tipo che mi serve,
giusto?
l'inserimento della stringa avviene in coda o in testa al file (sto parlando di map shared)?
e se avessi avuto un fle binario di interi?
ilsensine
15-11-2007, 09:17
che fa la "fstat"?
man fstat
e la ftruncate?
man ftruncate
quindi mi casto il puntaore void che mi restituitsce mmap, al tipo che mi serve,
giusto?
l'inserimento della stringa avviene in coda o in testa al file (sto parlando di map shared)?
e se avessi avuto un fle binario di interi?
Forse non hai ancora chiaro cosa fa la mmap su file. Viene creata una "finestra" in memoria che coincide con una parte del file; qualsiasi modifica fai dentro la finestra finirà dentro al file, e viceversa. Il concetto di "appendere" non appartiene alla mmap: per appendere dati tramite la mmap, devi prima allargare il file con ftruncate o simili, quindi creare una mappa sulla regione che ti interessa e scriverci dentro i dati.
Garet Jax
15-11-2007, 14:03
Il concetto di "appendere" non appartiene alla mmap: per appendere dati tramite la mmap, devi prima allargare il file con ftruncate o simili, quindi creare una mappa sulla regione che ti interessa e scriverci dentro i dati.
questo significa che se faccio un assegnamento, sovrascrivo il contenuto del file file mappato in memoria?
ilsensine
16-11-2007, 09:10
Sì esatto.
Garet Jax
16-11-2007, 15:23
Sì esatto.
bella!
comunque una cosa del genere è corretta?
mapped = (int) mmap(...);
mapped = 15;
Garet Jax
16-11-2007, 15:25
approposito, grazie per la consulenza!
:)
Garet Jax
16-11-2007, 15:27
un ultima cosa...
man fstate = no manual entry
man ftruncate = no manual entry
che devo fa?
mannaggia a linux!
ilsensine
16-11-2007, 17:50
comunque una cosa del genere è corretta?
mapped = (int) mmap(...);
mapped = 15;
No.
La mmap ritorna un puntatore.
ilsensine
16-11-2007, 17:54
man fstate = no manual entry
man ftruncate = no manual entry
che devo fa?
Installare le man page. Sui sistemi debian-like te la cavi con un
apt-get install manpages manpages-it manpages-dev manpages-posix manpages-posix-dev
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.