2016-03-17 21 views
5

Quando creiamo una memoria condivisa, usiamo la funzione shm_open() e ftruncate(). Secondo le mie informazioni shm_open() creare un'area di memoria condivisa. E poi usiamo la funzione ftruncate() per configurare la dimensione della regione di memoria condivisa.Scopo di shm_open() e ftruncate()?

Bene, in che modo shm_open() crea la regione di memoria in primo luogo quando non conosce ancora la dimensione? E se questo non è il caso e io sono totalmente sbagliato, quindi per favore dimmi lo scopo di shm_open() e ftruncate(). Grazie in anticipo !!!

risposta

8

Il punto principale di shm_open è che è possibile aprire un'area di memoria esistente. Tuttavia nel caso in cui non esistesse e avresti creare it, shm_open si comporta come open durante la creazione di un file; l'area di memoria appena creato ha dimensioni pari a 0. Da Linux manuals:

O_CREAT

creare l'oggetto di memoria condivisa, se non esiste. La proprietà dell'utente e del gruppo dell'oggetto viene presa dagli ID effettivi corrispondenti del processo chiamante e i bit di autorizzazione dell'oggetto sono impostati in base ai 9 bit di ordine basso, eccetto che quei bit impostati nella maschera di creazione della modalità file processo (vedi umask (2)) sono cancellati per il nuovo oggetto. Un insieme di costanti macro che possono essere utilizzate per definire la modalità è elencato in open (2). (Definizioni simboliche di queste costanti possono essere ottenuti inserendo.)

Un nuovo oggetto memoria condivisa inizialmente ha lunghezza zero - la dimensione dell'oggetto può essere impostato con ftruncate(2). I byte appena allocata di un oggetto di memoria condivisa sono automaticamente inizializzato a 0.

(sottolineatura mia)

Dal shm_open non prende la dimensione della zona di nuova creazione come un argomento (che sarebbe complicare la chiamata chiamata di sistema/libreria per aggiungere argomenti per tutti i tipi dei casi), ftruncate() deve u sed per modificare la dimensione di un'area di memoria condivisa aperta dalla sua dimensione iniziale.


Naturalmente non c'è bisogno di utilizzare ftruncate per un segmento di memoria condivisa che è già correttamente creato e ridimensionata altrove. Se vuoi conoscere le sue dimensioni, usa fstat. Vedi anche shm_overview(7)

+0

Sì. * shm_open * segue il concetto che il * creatore * della regione shm determina la sua dimensione, gli * utenti * non hanno nemmeno bisogno di * conoscerlo *. Altrimenti dovresti avere una sorta di * contratto * tra le parti quale dovrebbe essere la dimensione. – tofro