Our solution to the lab exercise 13.5 consists of several pieces of code:
  
  shmarray_setup.c    This program creates a shared memory segment and two 
		semaphores.  If the shared memory segment already exists,
		then this program is happy with that.  The two semaphores
		are known as the writer semaphore and the reader semaphore.
		After creating them, this program initializes the writer
		semaphore to 1 and the reader semaphore to 0.  If either
		(or both) of the semaphores already exist, then this 
		program just reinitializes them.

		THIS PROGRAM MUST BE RUN BEFORE shmarray_wtr AND shmarray_rdr.
  
  shmarray_wtr.c	These programs attach to the shared memory segment that
  shmarray_rdr.c	was created by shmarray_setup and use the two semaphores to
 		coordinate who can access the shared memory.  Only one
		of them can access it at a time.
  
  shmarray_helper.c	This file contains helper routines that are used by
		shmarray_wtr and shmarray_rdr to:
		  1) attach to the shared memory
		  2) get the semaphore IDs to use for coordination
		  3) perform Dijkstra P(s) and V(s) operations on the
		     sempaphores

		P(s) and V(s) are similar to our previously used
		TELL_WAIT() library of functions:

		V(reader) is like our TELL_CHILD()  - used by parent
		P(writer) is like our WAIT_CHILD()  - used by parent

		P(reader) is like our WAIT_PARENT()  - used by child
		V(writer) is like our TELL_PARENT()  - used by child
