-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsemaphore.c
More file actions
76 lines (62 loc) · 1.95 KB
/
Copy pathsemaphore.c
File metadata and controls
76 lines (62 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/** @file semaphore.c
* @brief Contiene l'implementazione delle funzioni
* specifiche per la gestione dei SEMAFORI.
*/
#include "semaphore.h"
#include "err_exit.h"
/**
* Crea, se non esiste, un set di semafori
* @param semKey - chiave per creare il set di semafori
* @param num - numero di semafori da creare
* @return semid_sync - id del set di semafori
*/
int alloc_semaphore(key_t semKey, int num)
{
// get, or create, a shared memory segment
int semid = semget(semKey, num, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR) ;
if(semid == -1)
errExit("semget failed: ");
printf("→ <Server>: Semaphore set create successfully!\n");
return semid;
}
/**
* Sincronizza il chiamante sul set di semafori specificato da semKey
* @param semKey - chiave del set di semafori
* @param num - numero di semafori del set su cui sincronizzarsi(deve corrispondere all'originale)
* @return semid_sync - id del set di semafori
*/
int get_semaphore(key_t semKey, int num)
{
int semid;
semid = semget(semKey, num, S_IRUSR | S_IWUSR) ;
if(semid == -1)
errExit("semget failed: ");
printf("→ <Client0>: Semaphore set synchronization successfully!\n");
return semid;
}
/**
* Esegue un operazione sul set di semafori
* @param semid - id del set di semafori
* @param sem_num - numero del semaforo su cui eseguire l'operazione
* @param sem_op - tipo di operazione
*/
void semOp (int semid, unsigned short sem_num, short sem_op)
{
struct sembuf sop = {.sem_num = sem_num, .sem_op = sem_op, .sem_flg = 0};
int res = semop(semid, &sop, 1);
if(res == -1){
printf("semaforo numero: %d\n", sem_num);
errExit("semop failed: ");
}
}
/**
* Elimina il set di semafori
* @param semid - id del set di semafori
*/
void remove_semaphore(int semid)
{
if(semctl(semid, 0, IPC_RMID, 0) == -1)
errExit("semctl failed: ");
else
printf("→ <Server>: Semaphore set removed successfully!\n");
}