Funzione shmget 2 c

Funzione shmget 2 c
La funzione shmget () viene utilizzata per creare una nuova coda di messaggi o per ottenere l'accesso a una esistente. La memoria condivisa è tra i metodi di comunicazione tra processi che consentono a due o più processi di scambiare rapidamente i dati e comunicare nello spazio utente. La memoria condivisa si riferisce a quando numerosi processi accedono alla stessa regione di memoria e possono modificarla o accedervi secondo necessità. Per chiarire, ogni processo ha il suo indirizzo di memoria; Se un processo desidera trasmettere i dati dalla sua memoria di sistema agli altri processi, sono disponibili solo i meccanismi IPC di comunicazione inter-process.

La comunicazione può verificarsi tra i sistemi collegati o non correlati, come siamo tutti consapevoli. Il metodo di chiamata di sistema shmget viene utilizzato per stabilire un nuovo segmento di memoria condivisa o individuarne uno esistente utilizzando una chiave. I segmenti di memoria condivisi sono sezioni di memoria a cui è possibile accedere da diversi processi e che, una volta stabiliti, rimane disponibili fino a quando non vengono esplicitamente distrutti con la funzione SHMCTL. Questo articolo ti mostrerà come utilizzare la funzione di chiamata di sistema Shmget in C linguaggio per allocare la memoria condivisa in vari modi.

Sintassi della funzione di chiamata di sistema shmget in lingua

int shmget (tasto key_t, size_t size, int shmflg);

Qui, abbiamo una sintassi generale della funzione di chiamata di sistema Shmget. Ci sono diversi parametri passati nella funzione Shmget. Questi parametri sono spiegati in dettaglio nella discussione seguente.

Il valore del tasto parametro viene restituito da Shmget () che restituisce il segmento di memoria condivisa di identificazione del sistema V. Se la chiave è privata IPC o non privata IPC, non esiste alcun segmento di memoria condiviso equivalente alla chiave e la creazione IPC è definita in SHMFLG, una nuova segmentazione di memoria condivisa con una dimensione equivalente al valore della dimensione ridimensionata fino a un multiplo La dimensione della pagina viene prodotta. (Questo è simile all'effetto aperto (2) di O creazione | o escl).

La dimensione necessaria del segmento è specificata dall'argomento delle dimensioni. Se si verifica attualmente il segmento, la dimensione non può superare le dimensioni fornite quando è stato creato. Inoltre, per definire quali utenti sono autorizzati ad accedere o modificare il segmento di memoria, uno qualsiasi dei bit di autorità S IRUSR, S Iwusr, S irgrp, s iwgrp, s iroth e s iwoth può essere fornito.

Esempio

Il codice di esempio mostra come utilizzare le funzioni di chiamata di sistema shmget e shmat in un singolo processo per creare un nuovo segmento condiviso e successivamente scrivere un po 'di testo in esso. Il codice di esempio mostra anche che i più processi possono trasmettere utilizzando la memoria collettiva.

#includere
#includere
#includere
#includere
#includere
#includere
#includere
#includere
enum Segment_Size = 0x6400;
const char *data = "hey, lì!";
int main (int argc, char *argv [])
Stato int;
int segment_id;
Segment_id = shmget (ipc_private, segmen_size,
IPC_Creat | Ipc_excl | S_irusr | S_iwusr);
char *sh_mem = (char *) shmat (segmen_id, 0, 0);
printf ("ID segmento %d \ n", segmen_id);
printf ("allegato a %p \ n", sh_mem);
memove (sh_mem, dati, strlen (dati) +1);
printf ("%s \ n", sh_mem);
pid_t child_pid = fork ();
if (Child_pid == -1)
Perror ("fork");
if (child_pid == 0)
strcpy (sh_mem, "nuovi dati nel processo figlio \ 0");
printf ("Child pid: %d \ n", getpid ());
usit (exit_success);
altro
pid_t ret = waitpid (Child_pid, & status, wuntraced | wContinued);
if (ret == -1)
perror ("waitpid");
if (mogliexited (status))
printf ("Stato del figlio uscito: %d \ n", wexitstatus (status));
if (wexitstatus (status) == 0)
printf ("%s \ n", sh_mem);

shmdt (sh_mem);
shmctl (segmen_id, ipc_rmid, 0);
usit (exit_success);

Innanzitutto, abbiamo incluso alcuni file di intestazione applicabili. La capacità di memoria condivisa è definita nel "sys/shm.File di intestazione h ". Inizia con l'implementazione del codice. Abbiamo definito la dimensione del segmento utilizzando il metodo Enum. La variabile viene dichiarata come i dati in cui viene inizializzata la stringa. Quindi, abbiamo la chiamata principale della funzione. Nella funzione principale di questo esempio, le variabili sono definite e inizializzate. Il Segement_id è inizializzato con il metodo Shmget. La chiave del segmento di memoria è il primo dei tre argomenti passati al metodo Shmget. Se è necessario stabilire un nuovo segmento, il valore chiave può essere la macro privata IPC o il valore chiave di un segmento esistente se la chiamata deve ottenere l'identificazione della memoria.

La dimensione del segmento è specificata dal secondo argomento e le flag di autorizzazione, che possono essere o-ed per aggiungere possibili valori, sono specificati dal terzo argomento di Shmget.

L'identificatore del segmento viene ricevuto dopo la formazione del segmento di memoria e può quindi essere inviato alla funzione SHMAT per collegare il segmento di memoria. Come secondo input a SHMAT, l'utente può specificare l'indirizzo in cui il segmento di memoria deve essere collegato. Tuttavia, è più comune consentire al kernel di determinare l'indirizzo e utilizzare null per indicarlo. La funzione printf stampa il valore ID del segmento e la memoria condivisa allegata e stampa la stringa "hey, lì".

Sono generate le forcelle "PID_T" primarie e un processo figlio "Child_Pid", ognuna delle quali risparmia una stringa distinta nello stesso indirizzo. Nel frattempo, il processo genitore si ferma e attende che il figlio finisca, quindi parte con un codice riuscito. La stringa appena salvata è scritta sulla console. Se molti processi devono alterare e acquisire i segmenti di memoria condivisi contemporaneamente, devono essere utilizzate tecniche di sincronizzazione come semafori.

L'esecuzione del codice precedente genera un output come questo. Viene generato l'ID del segmento, viene visualizzato l'indirizzo di memoria condivisa e la stringa viene stampata anche sul prompt. Il PID figlio e lo stato del figlio usciti vengono generati insieme al messaggio "Nuovi dati nel processo figlio".

Conclusione

Abbiamo esaminato la funzione di chiamata di sistema Shmget in modo molto dettagliato in questo post. La funzione shmget () recupera l'identificazione della memoria condivisa della chiave. Attraverso la funzione di chiamata di sistema Shmget, possiamo ottenere la memoria condivisa. Prima di poter usare la funzione shmget (), dobbiamo importare molte librerie. Questa funzione contiene i parametri che controllano una varietà di funzioni. Questo post ti aiuta a migliorare le tue capacità di programmazione e affrontare i problemi che potresti avere sulla funzione di chiamata di sistema Shmget.