// prodcons.C
#include <iostream>
using namespace std;
#include <unistd.h>
#include "sem.h"

int CreateProcess(void (*)());	/* func. prototype */

int psem, csem; /* semaphores */
int *pn;
main()
{
    void producer(), consumer();

    pn = (int *)shmcreate(sizeof(int));
    *pn = 0;
    csem = semcreate(0);
    psem = semcreate(1);
    CreateProcess(producer);
    consumer();		// let parent be the consumer
    semdelete(csem);
    semdelete(psem);
    shmdelete((char *)pn);
}	
void producer()
{
    int i;
    for (i=0; i<5; i++) {
        semwait(psem);
        (*pn)++;  // increment n by 1 
        semsignal(csem);
    }
}       
void consumer()
{
    int i;
    for (i=0; i<5; i++) {
        semwait(csem);
        cout << "n is " << *pn << '\n';   // print value of n
        semsignal(psem);
    }
}

int CreateProcess(void (*pFunc)())
{
    int pid;

    if ((pid = fork()) == 0) {
        (*pFunc)();
        exit(0);
    }
    return(pid);
}


