Files
2026-06-25 00:09:09 +08:00

52 lines
1.1 KiB
C++

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
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;
}