#include #include #include "shop.h" void get_haircut() { printf("Customer %d getting a haircut.\n", getpid()); sleep(2); } main( int argc, char *argv[] ) { CDATA *data = NULL; int i, shmid, mutex, customers, barbers; pid_t pid; mutex = sem_open(MUTEXKEY); customers = sem_open(CUSTOMERSKEY); barbers = sem_open(BARBERSKEY); shmid = shmget(SHMKEY, sizeof(CDATA), 0); if (shmid < 0) { fprintf(stderr, "shmget: %s\n", sys_errlist[errno]); exit(1); } data = (CDATA*)shmat(shmid, (char *)0, 0); if (data == (CDATA*)-1) { fprintf(stderr, "shmat: %s\n", sys_errlist[errno]); exit(1); } sem_wait(mutex); if(data->waiting == NUM_CHAIRS) { printf("Customer %d finds all the chairs full. Leaving./n", getpid()); sem_signal(mutex); exit(1); } data->chairs[data->waiting++] = getpid(); sem_signal(customers); sem_signal(mutex); sem_wait(barbers); get_haircut(); sem_close(mutex); shmdt((char*)data); exit(0); }