Two processes comunicating via shared memory
-
shm_server.c
-
-- simply creates the string and shared memory portion.
-
shm_client.c
-
-- attaches itself to the created shared memory portion and uses the string
(printf.
shm_server.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#define SHMSZ 27
main(){
char c;
int shmid;
key_t key;
char *shm, *s;
/* Name the shared memory segment "5678". */
key = 5678;
/* Create the segment. */
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
/* Attach the segment to our data space. */
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
/* Now put some things into the memory for the other process to read.*/
s = shm;
for (c = 'a'; c <= 'z'; c++)
*s++ = c;
*s = NULL;
/*Wait until the other process changes the first character of our memory
to '*', indicating that it has read what we put there.*/
while (*shm != '*')
sleep(1);
exit(0);
}
shm_client.c
/* shm-client - client program to demonstrate shared memory.*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#define SHMSZ 27
main(){
int shmid;
key_t key;
char *shm, *s;
/* Get the segment named "5678", created by the server. */
key = 5678;
/* Locate the segment.*/
if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
perror("shmget");
exit(1);
}
/* Now we attach the segment to our data space. */
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
/* Read what the server put in the memory. */
for (s = shm; *s != NULL; s++)
putchar(*s);
putchar('\n');
/* Finally, change the first character of the segment to '*',
indicating we have read the segment. */
*shm = '*';
exit(0);
}