#include #include #include #include #include #include #define MAX_PLAYERS 10 #define IPC_KEY 0x2007 #define SEM_PLAYERS MAX_PLAYERS // semáforo para entrar no jogo #define SEM_SERVER MAX_PLAYERS + 1 // semáforo do servidor #define UP(N) {struct sembuf up = {N, 1, 0}; semop(semid, &up, 1); } #define DOWN(N) {struct sembuf down = {N, -1, 0}; semop(semid, &down, 1); } typedef struct { char on; // se 1 jogador em jogo; se 0 não int n; // número da jogada corrente char who; // se 1 'move' diz respeito ao jogador; se 0 diz respeito ao servidor char move[4]; // última jogada do jogador ou última resposta do servidor } struct_player; struct_player *player; int semid; void exit_signal(int sig); main() { int shmid; // apanhar o sinal SIGINT (enviado pelo terminal quando se usa CTRL-C) signal(SIGINT, exit_signal); // alocar e mapear um segmento de memória partilhada if ((shmid = shmget(IPC_KEY, sizeof(struct_player) * MAX_PLAYERS, S_IRUSR | S_IWUSR)) == -1) { printf("erro no shmget!\n"); exit(0); } if ((player = (struct_player *) shmat(shmid, NULL, 0)) == (void *) -1) { printf("erro no shmat!\n"); exit(0); } // alocar um conjunto de semáforos if ((semid = semget(IPC_KEY, MAX_PLAYERS + 2, S_IRUSR | S_IWUSR)) == -1) { printf("erro no semget!\n"); exit(0); } ... } void exit_signal(int sig) { // libertar o segmento de memória partilhada shmdt(player); exit(0); }