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);
}