SHMGET 2 C -funksjon

SHMGET 2 C -funksjon
SHMGet () -funksjonen brukes til å bygge en ny meldingskø eller for å få tilgang til en eksisterende en. Delt minne er blant kommunikasjonsmetodene mellom prosessene som tillater to eller flere prosesser å raskt bytte ut dataene og kommunisere i brukerområdet. Delt minne refererer til når mange prosesser får tilgang til det samme minneområdet og kan endre eller få tilgang til det etter behov. For å avklare har hver prosess sin minneadresse; Hvis en prosess ønsker å overføre dataene fra systemminnet til de andre prosessene, er det bare IPC-mekanismer mellom prosesser som er tilgjengelige.

Kommunikasjon kan oppstå mellom systemene som er tilkoblet eller ikke relatert, da vi alle er klar over. SHMGet System Call -metoden brukes til å enten etablere et nytt delt minnesegment eller lokalisere et eksisterende ved hjelp av en nøkkel. Delte minnesegmenter er minneseksjoner som kan nås av flere prosesser, og som når de er etablert, forblir tilgjengelig til de eksplisitt blir ødelagt med SHMCTL -funksjonen. Denne artikkelen vil vise deg hvordan du bruker SHMGet -systemanropsfunksjonen på C -språk for å tildele det delte minnet på en rekke måter.

Syntaks for SHMGet -systemanropsfunksjonen på C -språk

int shmget (key_t nøkkel, størrelse_t størrelse, int shmflg);

Her har vi en generell syntaks av SHMGet -systemanropsfunksjonen. Det er forskjellige parametere som er bestått i SHMGet -funksjonen. Disse parametrene er forklart i detaljer i følgende diskusjon.

Verdien av parameternøkkelen returneres av SHMGET () som returnerer identifikasjonen som er delt minnesegment av systemet V. Hvis nøkkelen er IPC -privat eller ikke IPC privat, eksisterer det ikke noe delt minnesegment som tilsvarer nøkkelen, og IPC -opprettelsen er definert i SHMFLG, en ny delt minnesegmentering med en størrelse som tilsvarer verdien av størrelsen som skaleres opp til et multiplum Sidestørrelse produseres. (Dette ligner på den åpne (2) Effekten av o Creat | o ekskl.).

Segmentets nødvendige størrelse er spesifisert av størrelsesargumentet. Hvis segmentet for tiden oppstår, kan ikke størrelsen overstige størrelsen som ble gitt når det ble opprettet. For å definere hvilke brukere som er autorisert til å få tilgang til eller endre minnesegmentet, kan noen av autoritetsbitene S Irusr, S Iwusr, S irgrp, S IWGRP, S Iroth og S Iwoth leveres.

Eksempel

Eksempelkoden viser hvordan du bruker SHMGet- og SHMAT -systemanropsfunksjonene i en enkelt prosess for å lage et nytt delt segment og deretter skrive litt tekst inn i det. Eksempelkoden viser også at de flere prosessene kan overføre ved hjelp av det kollektive minnet.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
enum segment_size = 0x6400;
const char *data = "Hei, der!";
int main (int argc, char *argv [])
int -status;
int segment_id;
segment_id = shmget (ipc_private, segment_size,
IPC_Creat | IPC_EXCL | S_irusr | S_iwusr);
char *sh_mem = (char *) shmat (segment_id, 0, 0);
printf ("segment id %d \ n", segment_id);
printf ("festet til %p \ n", sh_mem);
Memmove (SH_MEM, DATA, STRLEN (DATA) +1);
printf ("%s \ n", sh_mem);
pid_t child_pid = gaffel ();
if (child_pid == -1)
Perror ("gaffel");
if (child_pid == 0)
strcpy (sh_mem, "nye data i barneprosess \ 0");
printf ("Child PID: %d \ n", getPid ());
exit (exit_success);
annet
pid_t ret = waitpid (child_pid, & status, wuntraced | wcontinued);
if (ret == -1)
Perror ("Waitpid");
if (wifexited (status))
printf ("status for barn som er forlatt: %d \ n", wexitstatus (status)));
if (wexitStatus (status) == 0)
printf ("%s \ n", sh_mem);

shmdt (sh_mem);
shmctl (segment_id, ipc_rmid, 0);
exit (exit_success);

Først inkluderte vi noen gjeldende overskriftsfiler. Den delte minnefunksjonen er definert i “SYS/SHM.h ”headerfil. Begynn med kodeimplementeringen. Vi definerte størrelsen på segmentet ved å bruke enummetoden. Variabelen er deklarert som dataene der strengen initialiseres. Deretter har vi hovedfunksjonssamtalen. I hovedfunksjonen til dette eksemplet er variablene definert og initialisert. Segement_id initialiseres med SHMget -metoden. Minnesegmentnøkkelen er den første av de tre argumentene som er gitt til SHMGet -metoden. Hvis et nytt segment krever å bli etablert, kan nøkkelverdien være IPC Private Macro eller nøkkelverdien til et eksisterende segment hvis samtalen trenger å få minneidentifikasjonen.

Størrelsen på segmentet er spesifisert av det andre argumentet, og tillatelsesflaggene, som kan eller-ED for å legge til mulige verdier, er spesifisert av det tredje argumentet til SHMGet.

Segmentidentifikatoren mottas etter at minnesegmentet er dannet, og det kan deretter sendes til SHMAT -funksjonen for å koble minnesegmentet. Som en annen inngang til SHMAT kan brukeren spesifisere adressen der minnesegmentet skal legges ved. Likevel er det mer vanlig å la kjernen bestemme adressen og bruke null for å indikere det. Printf -funksjonen skriver ut segment -ID -verdien og det vedlagte delte minnet og skriver ut "hei, der" -strengen.

Den primære prosessen “PID_T” gafler og en barneprosess “Child_pid” genereres, som hver sparer en distinkt streng i samme adresse. I mellomtiden stopper foreldreprosessen og venter på at barnet skal avsluttes med en vellykket kode. Den nylig lagrede strengen er skrevet til konsollen. Hvis mange prosesser trenger å endre og skaffe seg de delte minnesegmentene samtidig, må synkroniseringsteknikker som semaforer brukes.

Utførelsen av den forrige koden genererer en utdata som denne. Segment -IDen genereres, den delte minneadressen vises, og strengen skrives også ut på ledeteksten. Barnet PID og statusen til barnet som er forlatt genereres sammen med meldingen, "Nye data i barneprosess".

Konklusjon

Vi gikk over SHMGet System Call -funksjonen i detalj i dette innlegget. SHMGet () -funksjonen henter nøkkelenes delte minneidentifikasjon. Gjennom SHMGet -systemanropsfunksjonen kan vi få det delte minnet. Før vi kan bruke SHMGet () -funksjonen, må vi importere mange biblioteker. Denne funksjonen inneholder parametrene som kontrollerer en rekke funksjoner. Dette innlegget hjelper deg med å forbedre programmeringsferdighetene dine og ta opp problemene du måtte ha hatt om SHMGet -systemanropsfunksjonen.