Elaborato_SO/src/custom_sem.c

64 lines
1.4 KiB
C

#include <sys/sem.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <custom_sem.h>
#include <structures.h>
#include <errExit.h>
int _SEMID;
void resetServerSem(int semid);
void setupServerSem() {
key_t semKey = ftok(KEYFILE, SEMKEY);
_SEMID = semget(semKey, 3, IPC_CREAT | S_IRUSR | S_IWUSR);
if (_SEMID == -1) {
errExit("getsem", "F4Server");
}
resetServerSem(_SEMID);
}
void setupClientSem() {
key_t semKey = ftok(KEYFILE, SEMKEY);
_SEMID = semget(semKey, 3, IPC_CREAT | S_IRUSR | S_IWUSR);
if (_SEMID == -1) {
errExit("getsem", "F4Client");
}
}
void semOp(int semid, short sem_num, short sem_op) {
struct sembuf sop = {.sem_num = sem_num, .sem_op = sem_op, .sem_flg = 0};
int res;
do {
res = semop(semid, &sop, 1);
} while ((errno == EINTR));
if (res == -1) {
errExitMsg("semOp");
}
}
int getSemid(key_t key, int size){
int semid = semget(key, size, S_IRUSR | S_IWUSR | IPC_CREAT);
if (semid == -1) {
errExit("semget", "getSemid");
}
return semid;
}
// mette i semafori a 0 e 2
void resetServerSem(int semid){
unsigned short val[3] = {0, 0, 0}; // player1, player2, server
union semun arg;
arg.array = val;
if (semctl(semid, 0 , SETALL, arg) == -1) {
errExit("semctl", "getSemid");
}
}