#include #include #include #include #include #include #include union semun { int val; struct semid_ds *buf; unsigned short *array; struct seminfo *__buf; } arg; int semid; void philosopher(int i) { struct sembuf sbuf[2]; sbuf[0].sem_num = i; sbuf[0].sem_flg = SEM_UNDO; sbuf[1].sem_num = (i + 1) % 5; sbuf[1].sem_flg = SEM_UNDO; while (1) { printf("philosopher %d is thinking\n", i); sleep(2); printf("philosopher %d is hungry\n", i); sbuf[0].sem_op = -1; sbuf[1].sem_op = -1; semop(semid, sbuf, 2); printf("philosopher %d is eating\n", i); sleep(2); sbuf[0].sem_op = 1; sbuf[1].sem_op = 1; semop(semid, sbuf, 2); } } int main() { key_t key = ftok("fname", 1); semid = semget(key, 5, IPC_CREAT | 0666); arg.val = 1; for (int i = 0; i < 5; i++) semctl(semid, i, SETVAL, arg); for (int i = 0; i < 5; i++) { if (fork() == 0) { philosopher(i); } } while (wait(NULL) > 0); return 0; }