/* David A. Hess CS382 Dining Philosophers */ #include #include #include #include #include #include #include #include extern int errno; #define SEMPERM 0600 initsem(); p(); v(); int initsem(semkey,semvalue) key_t semkey; int *semvalue; { int status = 0, semid; if((semid = semget(semkey,1,SEMPERM|IPC_CREAT|IPC_EXCL))==-1) { if(errno == EEXIST) semid = semget(semkey,1,0); }else status = semctl(semid,0,SETVAL,semvalue); if(semid == -1 || status == -1) { perror("initsem failed"); return(-1); }else return semid; } int p(semid) int semid; { struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = SEM_UNDO; if(semop(semid, &p_buf, 1) == -1) { perror("p(semid) failed"); exit(1); }else return(0); } int v(semid) int semid; { struct sembuf v_buf; v_buf.sem_num = 0; v_buf.sem_op = 1; v_buf.sem_flg = SEM_UNDO; if(semop(semid, &v_buf, 1) == -1) { perror("v(semid) failed"); exit(1); }else return(0); } main() { int frk[5], room, i; key_t semkey = 0x200; int phil0id,phil1id,phil2id,phil3id,phil4id,retval; int semvalue = 1; for(i=0;i<5;i++) { if((frk[i] = initsem(semkey,&semvalue)) < 0) { printf("Error initializing frk[%d] semaphore\n",i); exit(1); } printf("frk[%d] initialized to semid %d\n",i,frk[i]); retval = semctl(frk[i],0,GETVAL,semvalue); printf("frk[%d] initialized to semvalue %d\n",i,retval); semkey += 0x010; } semvalue = 4; if((room = initsem(semkey,&semvalue)) < 0) { printf("Error initializing room semaphore\n"); exit(1); }else printf("room initialized to semid %d\n",room); retval = semctl(room,0,GETVAL,semvalue); printf("room initialized to semvalue %d\n",retval); if((phil0id = fork()) < 0) { perror("phil 0 failed\n"); exit(1); }else if(phil0id == 0) philosopher(0,frk,room); else if((phil1id = fork()) < 0) { perror("phil 1 failed\n"); exit(1); }else if(phil1id == 0) philosopher(1,frk,room); else if((phil2id = fork()) < 0) { perror("phil 2 failed\n"); exit(1); }else if(phil2id == 0) philosopher(2,frk,room); else if((phil3id = fork()) < 0) { perror("phil 3 failed\n"); exit(1); }else if(phil3id == 0) philosopher(3,frk,room); else if((phil4id = fork()) < 0) { perror("phil 4 failed\n"); exit(1); }else if(phil4id == 0) philosopher(4,frk,room); else { wait(0); printf("Time to stop. Now killing semaphores.\n"); retval = semctl(room,0,IPC_RMID,4); for(i=0;i<5;i++) retval = semctl(frk[i],0,IPC_RMID,1); } exit(0); } int philosopher(i,frk,room) int i, frk[], room; { int j,retval; for(j=0;j<10;j++) { printf("Philosopher %d is thinking.\n",i); sleep(1); p(room); p(frk[i]); p(frk[(i+1)%5]); printf("Philosopher %d is eating.\n",i); sleep(2); v(frk[i]); v(frk[(i+1)%5]); v(room); } exit(0); }