Memoria condivisa Posix con programmazione C

Memoria condivisa Posix con programmazione C
La memoria condivisa POSIX è un framework per la comunicazione inter-Process (IPC) specificata nelle specifiche POSIX. Due (o più) attività possono leggere da esso e scrivere nella zona di memoria condivisa mentre si stabiliscono la memoria condivisa. La memoria condivisa POSIX non applica sempre gli esborsi di copia, in contrasto con altre strutture IPC (E.G., Pipe, presa, ecc.) ed è desiderabile per alcuni programmi.

Chiamate di memoria condivisa Posix

Le funzioni di memoria condivisa POSIX si sono concentrate sul concetto UNIX secondo cui l'oggetto deve essere un documento quando si esegue le attività di input/output su un'entità. Pertanto, poiché reciti e iscrivi a un'entità di memoria Posix reciproca, quest'ultimo deve essere considerato come un documento. Un documento mappato a memoria è un'entità di memoria condivisa Posix. Per usare il shm_open Funzione di chiamata di sistema sottostante /dev/shm, Vengono generati documenti di memoria condivisa separati. Ci sono solo due chiamate di sistema di memoria condivisa dedicate da Posix, shm_open, E shm_unlink, che sono strettamente correlati all'apertura e alle chiamate di file system. IL ftruncate, mmap, E munmap Framework Chiamata per i documenti vengono utilizzati per eseguire altre attività sulla memoria condivisa POSIX. È necessario collegare un programma che utilizza chiamate di memoria condivisa POSIX -lrt.

I programmi che utilizzano le chiamate di memoria condivisa POSIX devono seguire i seguenti passaggi:

Usando shm_open (), Formare un oggetto di memoria condiviso. Il descrittore del documento può essere ripristinato se la formazione dell'oggetto ha esito positivo.

Con ftruncate (), La dimensione dell'oggetto verrà fissata.

Con carta geografica() E Map_shared, Delineare questo oggetto nello spazio degli indirizzi attuali.

Leggi/scrivi la memoria condivisa.

attraverso munmap (), non delineato la memoria condivisa.

Utilizzo vicino() Per chiudere l'oggetto.

Attraverso shm_unlink (), Elimina l'oggetto nella memoria condivisa.

shm_open ()

Come descritto sopra, shm_open () viene utilizzato per generare un nuovo oggetto di memoria condiviso. Rende l'oggetto accessibile alla procedura chiamante utilizzando il descrittore ripristinato. Quanto segue è la definizione di questa funzione di funzione:

>> int shm_open (const char *nome, int oflag, modalità modalità_t);

Il primo parametro è il nome dell'oggetto di memoria condivisa. È una stringa di terminazione null di /nome Digita, con la clausola che nessun altro personaggio può essere una barra diversa dal suo primo personaggio. Oflag è un piccolo velo creato con molte delle bandiere precedenti di o-ing, sia tramite O_rdonly O O_rdwr. I parametri descritti indicano che il suo oggetto di memoria condivisa deve essere formato (O_Creat) quando non esiste già e anche l'oggetto è disponibile per la lettura e la scrittura (O_RDWR). L'ultimo argomento imposta le approvazioni della directory per l'oggetto di memoria condivisa.

shm_unlink ()

Shm_unlink () Elimina l'entità di memoria condivisa Posix che in precedenza è stata sviluppata. Il descrittore di documenti interi per l'oggetto di memoria condivisa viene restituito tramite una chiamata efficace a shm_open (). Come definito sotto il shm_open (), Il nome del parametro è il titolo dell'entità di memoria condivisa. Quanto segue è la definizione di shm_unlink () funzione:

>> int shm_unlink (const char *nome);

ftruncate ()

Dopo aver impostato l'oggetto, il ftruncate () Il metodo viene lanciato per impostare la dimensione dell'entità nei byte. La definizione della funzione è la seguente:

>> int ftruncate (int fd, off_t lunghezza);

Quando si costruisce una memoria POSIX condivisa, è effettivamente zero byte di capacità di dimensioni. È possibile rendere l'entità di memoria condivisa POSIX con byte di lunghezza delle dimensioni ftruncate. Ftruncate produce zero in esecuzione. Ftruncate Output -1 in caso di guasto e errno è impostato per attivare l'errore.

mmap ()

Alla fine, un documento mappato a memoria con l'entità della memoria condivisa è impostato tramite il mmap () metodo. Quindi, produce un puntatore di documenti mappato a memoria che viene lanciato per raggiungere l'entità della memoria condivisa. Quanto segue è la definizione di mmap () funzione:

>> void *mmap (void *addr, size_t lunghezza, int prot, int flags, int fd, off_t offset);

In questo, "ADDR" è l'indirizzo a cui verrà mappato. La "lunghezza" è l'intervallo dell'entità di memoria condivisa. I valori per Prot possono differire, ma useremo la lettura Prot | Prot write. Esistono diverse flag, ma la mappa condivisa è essenziale per la memoria condivisa. Ora, "FD" è un descrittore di documenti che è stato ottenuto in precedenza. L'offset è il punto in cui la mappatura inizia nell'entità di memoria condivisa; Il valore di offset 0 può anche essere utilizzato. Al termine, mmap () produce il puntatore alla posizione di mappatura dell'entità di memoria condivisa.

munmap ()

Nella posizione diretta da ADDR e di ottenere dimensioni, lunghezza, munmap non mappa l'elemento di memoria condiviso. Munmap produce 0 al termine e -1 nella situazione dell'imprecisione, nel qual caso Errno viene assegnato per attivare l'errore.

>> void munmap (void *addr, size_t lunghezza);

Esempio: mittente e ricevitore

Prendiamo l'esempio del mittente e del ricevitore. Il mittente creerà un nuovo oggetto di memoria condivisa con il nome /Shmem-Example e iscrivi tre numeri nella memoria condivisa attraverso di essa. Ora, il ricevitore può esporre l'oggetto nella memoria condivisa e recitare i tre numeri dalla memoria. Creeremo tre file con i nomi protocollo.H, mittente.C, E ricevitore.C.

$ touch protocol.H
$ touch mittente.C
ricevitore da $ touch.C

Successivamente, aggiungeremo il codice sorgente seguente al protocollo dei file.h, "mittente.C, 'e' ricevitore.C.«Ora, salveremo tutti e chiudermo.

Ora compileremo e unire il codice sopra utilizzando la parola chiave -lrt separatamente per il mittente.C e ricevitore.file c. Ecco il comando per farlo:

$ gcc -o mittente mittente.c -lrt
$ GCC -o ricevitore ricevitore.c -lrt

Ora eseguiremo il codice mittente utilizzando il comando seguente. L'output è riportato di seguito.

$ ./mittente

Esecuzione del codice mittente, l'oggetto di memoria condivisa è stato generato e può essere trovato sotto /dev/shm Usando il comando qui sotto:

$ ls -l /dev /shm | Grep Shmem-Example

Quando eseguiamo il codice del ricevitore, otterremo l'output di seguito:

$ ./ricevitore

Ogni volta che la funzione gm_unlink () viene chiamato utilizzando il ricevitore del file.C, 'L'oggetto /dev/shm/shmem-example sarà distaccato. In questo caso, non otterrai alcun oggetto sull'output, come mostrato di seguito.

$ ls -l/dev/shm/shmem -example

Conclusione

In questo articolo, hai imparato a utilizzare la memoria condivisa POSIX con la programmazione C in Ubuntu 20.04, inclusa ogni chiamata di funzione utilizzata per stabilire la memoria condivisa. Spero che questo articolo ti abbia aiutato a migliorare le tue conoscenze di programmazione e coperto ogni dubbio che hai su questo argomento.