Deljenom memorijom se definiše oblast (segment) memorije koja se mapira i deli između više procesa. Ovo je najbrži oblik IPC zato što nema posrednika. Informacije se mapiraju direktno iz memorijskog segmenta u adresni prostor pozivajućeg procesa. Segment kreira jedan proces, a više procesa mogu da čitaju i pišu iz njega. Jezgro OS održava specijalnu internu strukturu za svaki segment deljene memorije koji postoji u njegovom adresnom prostoru (linux/shm.h)
Sistemski poziv shmget()
Alocira segment deljene memorije.
Ako je uspešno izvedeno alociranje povratna vrednost je identifikator ka segmentu memorije, a ako nije -1 i postavlja errno na vrednosti:
EINVAL (Invalid segment size specified)
EEXIST (Segment exists, cannot create)
EIDRM (Segment is marked for deletion, or was removed)
ENOENT (Segment does not exist)
EACCES (Permission denied)
ENOMEM (Not enough memory to create segment)
Primer:
Sistemski poziv shmctl()
Izvršava operaciju kontrole definisanu sa cmd parametrom nad segmentom deljene memorije čiji je identifikator definisan sa shmid parametrom.
Povratna vrednost je 0 ako je operacija uspešno izvedena ili -1 ako nije i errno prima vrednosti:
EACCES (No read permission and cmd is IPC_STAT)
EFAULT (Address pointed to by buf is invalid with IPC_SET and IPC_STAT commands)
EIDRM (Segment was removed during retrieval)
EINVAL (shmqid invalid)
EPERM (IPC_SET or IPC_RMID command was issued, but calling process does not have write (alter) access to the segment)
Vrednosti parametra cmd mogu biti:
IPC_STAT - Uzima vrednost shmid_ds strukture segmenta i skladišti u adresu buf argumenta
IPC_SET - Postavlja vrednost ipc_perm člana ili shmid_ds strukture segmenta. Uzima vrednosti iz buf argumenta.
IPC_RMID - Obeležava segment za uklanjanje. Stvarno uklanjanje se vrši kada se poslednji proces koji je prikačen na segment otkači. Ako nijedan proces nije nakačen na segment uklanjanje je trenutno.
Sistemski poziv shmat()
Kači memorijski segment identifikovan sa shmid u adresni prostor pozivajućeg procesa.
Ako je argument shmaddr 0 (NULL), jezgro OS pokušava da nađe nemapirani region. Ovakav način je preporučljiv. Adresa može biti definisana, ali se takav način uglavnom koristi samo za vlasnički hardver ili da bi se razrešili konflikti sa drugim aplikacijama.
Povratna vrednost je adresa na kojoj je segment prikačen za proces ili -1 i errno:
EINVAL (Invalid IPC ID value or attach address passed)
ENOMEM (Not enough memory to attach segment)
EACCES (Permission denied)
Primer:
Sistemski poziv shmdt()
Odvaja segment deljenje memorije lociran na adresi definisanoj sa shmaddr od adresnog prostora pozivajućeg procesa. Segment koji treba da se odvaja mora prethodno biti prikačen pozivom shmat(). Parametar shmaddr je povratna vrednost sistemskog poziva shmat().
Ovim pozivom se ne uklanjanje segment iz jezgra OS. Nakon uspešnog odvajanja shm_nattch član strukture shmid_ds se smanjuje za jedan. Kada vrednost postane 0 jezgro fizički uklanja segment.
Ako je uspešno izvedeno povratna vrednost je 0, a ako nije -1 i errno:
EINVAL (Invalid attach address passed)
Primer
Program radi jednu od dve stari:
Ako nije prosledjen nijedan parametar komandne linije štampa se sadržaj segmenta deljene memorije
Ako je prosleđen jedan parametar komandne linije onda se taj parametar skladišti u segmentu deljene memorije.
Program iz primera pristupa deljenoj memoriji bez upotrebe semafora. Zašto je to opasno?