#include #include #include "shop.h" CDATA *data = NULL; int mutex, customers, barbers; void cut_hair(pid_t pid) { printf("Barber (%d) cutting %d's hair...\n", getpid(), pid); sleep(lrand48() % 10); } void inthandler(int sig) { sem_close(mutex); sem_close(customers); sem_close(barbers); shmdt((char*)data); exit(0); } main( int argc, char *argv[] ) { int i, shmid; 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 < 0) { fprintf(stderr, "shmat: %s\n", sys_errlist[errno]); exit(1); } signal(SIGINT, inthandler); while(1) { sem_wait(customers); sem_wait(mutex); pid = data->chairs[0]; for (i=1; ichairs[i-1] = data->chairs[i]; data->waiting--; sem_signal(barbers); sem_signal(mutex); cut_hair(pid); } sem_close(mutex); sem_close(customers); sem_close(barbers); shmdt((char*)data); exit(0); }