#include #include #include #include #include #include #include #include #include #define P(s,i) { \ struct sembuf pop; \ pop.sem_num = i; \ pop.sem_op = -1; \ pop.sem_flg = 0; \ semop(s, &pop, 1); \ } #define V(s,i) { \ struct sembuf vop; \ vop.sem_num = i; \ vop.sem_op = 1; \ vop.sem_flg = 0; \ semop(s, &vop, 1); \ } int greedychoice ( int *M ) { int t; for (t=5; t>=1; --t) { if ((t <= M[0]) && (t != M[1]) && (t != M[2]) && (t != M[3])) return t; } return 0; } void playgame ( int pno, int shmid, int semid ) { int *M, mysum, npno, t, i; M = shmat(shmid,0,0); npno = pno + 1; if (npno == 3) npno = 0; mysum = 0; P(semid,pno); if ((pno == 2) && (M[4] == 0)) { printf("\t"); fflush(stdout); } while (M[0]) { t = greedychoice(M); M[0] -= t; M[1] = M[2]; M[2] = M[3]; M[3] = t; ++M[4]; mysum += t; printf("%s%d%s", (pno) ? "\t" : "", t, (pno == 2) ? "\n" : ""); fflush(stdout); if (M[0] == 0) printf("%s------------------\n", (pno == 2) ? "" : "\n"); V(semid,npno); P(semid,pno); } V(semid,npno); for (i=0; i 1) ? atoi(argv[1]) : 100; shmid = shmget(IPC_PRIVATE, 5 * sizeof(int), 0644 | IPC_CREAT); M = (int *)shmat(shmid, 0, 0); M[0] = N; M[1] = M[2] = M[3] = 0; M[4] = 0; semid = semget(IPC_PRIVATE, 3, 0644 | IPC_CREAT); semctl(semid, 0, SETVAL, 0); semctl(semid, 1, SETVAL, 0); semctl(semid, 2, SETVAL, 0); for (pno=0; pno<3; ++pno) { if (!fork()) playgame(pno,shmid,semid); } printf("------------------\nP0\tP1\tP2\n------------------\n"); pno = rand() % 3; V(semid, pno); for (pno=0; pno<3; ++pno) wait(NULL); shmdt(M); shmctl(shmid, IPC_RMID, 0); semctl(semid, IPC_RMID, 0); exit(0); }