Shared memory

CS 3100
Operating Systems
Fall 2003
Shared memory in a local UNIX/Linux domain
The following example demonstrates the use of shared memory between independent Unix processes in a local
domain. The system calls used are;
 int shmget (int key, int size, int mode); Returns an integer ID for a persistent block of shared memory of
size bytes. Key is a publicly known positive integer key by which all processes will get access to the shared
memory block. (A key of IPC_PRIVATE produces a temporary block that is only available for this process
and any forked children. The mode parameter specifies read/write priveledge in a manner similar to files.
 char *shmat (int shmid, 0, 0); Used to attach a shared memory block to a local address pointer. Returns the
address of the shared memory block associated with shmid. Returns an error code (<0) if unsuccessful.
The parameter types and options are documented in associated man pages, but the following example demonstrates
the creation and access of a single shared memory block of 64 bytes.
/* shm_test.c: demo of shared memory */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SIZE 64
void main()
{ int shmid, n;
char *buf, c;
printf (“enter shared memory key: “);
scanf (“%d”, &semid);
semid = shmget (key, SIZE, 0666 | IPC_CREAT);
/* read/write access for all */
/* create it if it doesn’t
exist */
buf = shmat (semid, 0, 0);
shared memory block */
while (1)
{ printf (“enter index and value: “);
loop */
scanf (“%d %c”, %n, &c);
buf[n] = c;
/* buf now points to
/* simple demonstration
/* store in shared memory
In another independent program executed after the above program has started or run...
semid = shmget (key, SIZE, 0666);
buf = shmat (semid, 0, 0);
while (1)
{ printf (“enter index to examine: “);
scanf (“%d”, &n);
printf (“memory value: %c\n”, buf[n]);
CS 3100
Operating Systems
Fall 2003
Shared memory is persistent (except for IPC_PRIVATE blocks). Existing blocks can be listed using the ipcs command and removed with the ipcrm command similar to semaphores and message queues.