-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshared_memory.c
More file actions
84 lines (70 loc) · 2.25 KB
/
shared_memory.c
File metadata and controls
84 lines (70 loc) · 2.25 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
76
77
78
79
80
81
82
83
84
/** @file shared_memory.c
* @brief Contiene l'implementazione delle funzioni
* specifiche per la gestione della MEMORIA CONDIVISA.
*/
#include "shared_memory.h"
#include "err_exit.h"
/**
* Crea, se non esiste, un segmento di memoria condivisa
* @param shmKey - chiave per creare la shared memory
* @param size - dimensione zona di memoria
* @return shmid - id del segmento di memoria
*/
int alloc_shared_memory(key_t shmKey, size_t size)
{
int shmid;
shmid = shmget(shmKey, size, IPC_CREAT | S_IRUSR | S_IWUSR | IPC_EXCL) ;
if(shmid == -1)
errExit("shmget failed: ");
printf("→ <Server>: Shared memory create successfully!\n");
return shmid;
}
/**
* Sincronizza il chiamante sulla shared memory specificata da shmKey
* @param shmKey - chiave della shared memory
* @param size - dimensione zona di memoria(deve essere <= alla shared memory già esistente)
* @return shmid - id del segmento di memoria
*/
int get_shared_memory(key_t shmKey, size_t size)
{
int shmid;
shmid = shmget(shmKey, size, S_IRUSR | S_IWUSR) ;
if(shmid == -1)
errExit("shmget failed: ");
printf("→ <Client0>: Shared memory synchronization successfully!\n");
return shmid;
}
/**
* Link della zona di memoria nello spazio di indirizzamento logico del processo
* @param shmid - id del segmento di memoria
* @param shmflg - flag per la system call
* @return void * - puntatore alla zona di memoria condivisa
*/
void *attach_shared_memory(int shmid, int shmflg)
{
int *ptr = shmat(shmid, NULL, shmflg);
if(ptr == (void *)-1)
errExit("shmat failed: ");
return ptr;
}
/**
* Unlink della zona di memoria nello spazio di indirizzamento logico del processo
* @param ptr_sh - puntatore alla zona di memoria condivisa
*/
void free_shared_memory(void *ptr_sh)
{
if(shmdt(ptr_sh) == -1)
errExit("shmdt failed: ");
}
/**
* Segna la zona di memoria come removibile, se il processo è l'ultimo ad eseguire
* la detach, allora l'area di memoria viene eliminata
* @param semid - id alla zona di memoria condivisa
*/
void remove_shared_memory(int shmid)
{
if(shmctl(shmid, IPC_RMID, NULL) == -1)
errExit("shmctl failed: ");
else
printf("→ <Server>: Shared memory removed successfully!\n");
}